我试图在Swift / Xcode6中使用UITextFieldDelegate,我正在努力使用我应该使用stringByReplacingCharactersInRange的方式.编译器错误是’无法将表达式的类型’String’转换为类型’$T8′.
func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange,replacementString string: String!) -> Bool { let s = textField.text.stringByReplacingCharactersInRange(range:range,withString:string) if countElements(s) > 0 { } else { } return true }
更新Xcode 6 Beta 5:事情是shouldChangeCharactersInRange给出一个NSRange对象,我们需要一个Swift Range对象为stringByReplacingCharactersInRange.这可能还是一个bug,因为我不明白为什么我们还应该处理NS *对象?代表方法的String参数是Swift类型.
以下是各种Swift版本中计算结果字符串的方法.
请注意,所有方法都以完全相同的方式使用 – [NSString stringByReplacingOccurrencesOfString:withString:],语法不同.
这是计算结果字符串的首选方法.转换为Swift范围并在Swift字符串上使用它是容易出错的.例如,Johan的答案在使用非ASCII字符串时以几种方式是不正确的.
Swift 3:
func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool { let result = (textField.text as NSString?)?.replacingCharacters(in: range,with: string) ?? string // ... do something with `result` }
Swift 2.1:
func textField(textField: UITextField,replacementString string: String) -> Bool { let result = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range,withString: string) // ... do something with `result` }
Swift 1(仅供参考):
let result = textField.text.bridgeToObjectiveC().stringByReplacingCharactersInRange(range,withString:string)