我正在尝试在Swift / Xcode6中使用UITextFieldDelegate,并且正在为应该使用stringByReplacingCharactersInRange的方式而苦苦挣扎。编译器错误为“无法将表达式的类型“字符串”转换为类型“ $ 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对象,而stringByReplacingCharactersInRange需要一个Swift Range对象。仍然可以认为这是一个错误,因为我不明白为什么我们仍然应该处理NS *对象?无论如何,委托方法的String参数是Swift类型。
以下是在各种Swift版本中计算结果字符串的方法。
请注意,所有方法的使用-[NSString stringByReplacingOccurrencesOfString:withString:]方式完全相同,只是语法不同。
-[NSString stringByReplacingOccurrencesOfString:withString:]
这是计算结果字符串的首选方法。转换为Swift Range并在Swift上使用它String容易出错。例如,当对非ASCII字符串进行操作时,Johan的答案在很多方面都是错误的。
Range
String
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` }
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let result = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string) // ... do something with `result` }
let result = textField.text.bridgeToObjectiveC().stringByReplacingCharactersInRange(range, withString:string)