一尘不染

在Swift中使用stringByReplacingCharactersInRange

swift

我正在尝试在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类型。


阅读 1134

收藏
2020-07-07

共1个答案

一尘不染

以下是在各种Swift版本中计算结果字符串的方法。

请注意,所有方法的使用-[NSString stringByReplacingOccurrencesOfString:withString:]方式完全相同,只是语法不同。

这是计算结果字符串的首选方法。转换为Swift
Range并在Swift上使用它String容易出错。例如,当对非ASCII字符串进行操作时,Johan的答案在很多方面都是错误的。

斯威夫特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, shouldChangeCharactersInRange range: NSRange, 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)
2020-07-07