xcode- 几个案例的重构开关。
xcode- Refactoring switch with several cases.
所以基本上我想创建一个键盘,当用户点击一个字母时应该发生一些事情:
@IBAction func letterBtn(sender: UIButton) { // All the letter buttons are linked to this func.
switch sender.currentTitle! {
case "A":
moveLetters(sender)
case "B":
moveLetters(sender)
case "C":
moveLetters(sender)
case "D":
moveLetters(sender)
case "E":
moveLetters(sender)
case "F":
moveLetters(sender)
case "G":
moveLetters(sender)
default :
println("Error")
}
}
func animateLetter (pos: UILabel, btn: UIButton) { // Make the letter move towards a label.
UIView.animateWithDuration(0.5, animations: { () -> Void in
btn.center = pos.center
})
}
func moveLetters (btn: UIButton) { // Determine which label the pressed letter should move towards.
switch emptyPos.count {
case 1:
animateLetter(pos1, btn: btn)
emptyPos.append(0)
case 2:
animateLetter(pos2, btn: btn)
emptyPos.append(0)
case 3:
animateLetter(pos3, btn: btn)
emptyPos.append(0)
case 4:
animateLetter(pos4, btn: btn)
emptyPos.append(0)
default:
println("Error")
}
}
我发现自己使用多个 switch case,它们在 2 个不同的函数中基本上做同样的事情,我想知道是否有比对整个字母表以及我的其他函数使用 26 个 case 更好的方法。
首先,您可以combine例:
switch sender.currentTitle! {
case "A", "B", "C": ... etc
// do something
其次,switch 语句允许 intervals,您可以通过查看按钮标题的第一个字符从中获益:
switch sender.currentTitle![0] {
case "A"..."Z":
// do something
}
至于你的另一个问题,我会给每个标签一个标签(pos1.tag = 1,pos2.tag = 2)等,然后使用viewWithTag函数来获取正确的标签。
@Glorfindel 在 "A"..."Z"
范围内的回答很好。您也可以使用 NSRegularExpression
这样做:
let regex = try! NSRegularExpression(pattern: "^[A-Z]", options: .CaseInsensitive)
let range = NSMakeRange(0, distance(str.startIndex, str.endIndex))
if let match = regex.firstMatchInString(str, options: .ReportCompletion, range: range) {
// Do something
}
所以基本上我想创建一个键盘,当用户点击一个字母时应该发生一些事情:
@IBAction func letterBtn(sender: UIButton) { // All the letter buttons are linked to this func.
switch sender.currentTitle! {
case "A":
moveLetters(sender)
case "B":
moveLetters(sender)
case "C":
moveLetters(sender)
case "D":
moveLetters(sender)
case "E":
moveLetters(sender)
case "F":
moveLetters(sender)
case "G":
moveLetters(sender)
default :
println("Error")
}
}
func animateLetter (pos: UILabel, btn: UIButton) { // Make the letter move towards a label.
UIView.animateWithDuration(0.5, animations: { () -> Void in
btn.center = pos.center
})
}
func moveLetters (btn: UIButton) { // Determine which label the pressed letter should move towards.
switch emptyPos.count {
case 1:
animateLetter(pos1, btn: btn)
emptyPos.append(0)
case 2:
animateLetter(pos2, btn: btn)
emptyPos.append(0)
case 3:
animateLetter(pos3, btn: btn)
emptyPos.append(0)
case 4:
animateLetter(pos4, btn: btn)
emptyPos.append(0)
default:
println("Error")
}
}
我发现自己使用多个 switch case,它们在 2 个不同的函数中基本上做同样的事情,我想知道是否有比对整个字母表以及我的其他函数使用 26 个 case 更好的方法。
首先,您可以combine例:
switch sender.currentTitle! {
case "A", "B", "C": ... etc
// do something
其次,switch 语句允许 intervals,您可以通过查看按钮标题的第一个字符从中获益:
switch sender.currentTitle![0] {
case "A"..."Z":
// do something
}
至于你的另一个问题,我会给每个标签一个标签(pos1.tag = 1,pos2.tag = 2)等,然后使用viewWithTag函数来获取正确的标签。
@Glorfindel 在 "A"..."Z"
范围内的回答很好。您也可以使用 NSRegularExpression
这样做:
let regex = try! NSRegularExpression(pattern: "^[A-Z]", options: .CaseInsensitive)
let range = NSMakeRange(0, distance(str.startIndex, str.endIndex))
if let match = regex.firstMatchInString(str, options: .ReportCompletion, range: range) {
// Do something
}