Ios 在Swift 2中使用KSTokenView

Ios 在Swift 2中使用KSTokenView,ios,swift,swift2,kstokenview,Ios,Swift,Swift2,Kstokenview,我正试图在Swift 2项目中实现KSTokenView。我已经修复了转换过程中的所有小错误,但是我有三个相同错误的实例,我不知道如何修复。问题在于advance方法,我得到了一个编译时错误,上面写着“advance不可用:调用索引上的advancedBy(n)”方法。我试图寻找涉及此方法的另一个答案,但在挣扎了一段时间后,我无法找到它 问题代码是: 第一个实例在下面的方法中,我将用注释标记它 private func _updateText() { if (!_setupComplet

我正试图在Swift 2项目中实现KSTokenView。我已经修复了转换过程中的所有小错误,但是我有三个相同错误的实例,我不知道如何修复。问题在于advance方法,我得到了一个编译时错误,上面写着“advance不可用:调用索引上的advancedBy(n)”方法。我试图寻找涉及此方法的另一个答案,但在挣扎了一段时间后,我无法找到它

问题代码是:

第一个实例在下面的方法中,我将用注释标记它

private func _updateText() {
    if (!_setupCompleted) {return}
    _initPlaceholderLabel()

    switch(_state) {
    case .Opened:
        text = KSTextEmpty
        break

    case .Closed:
        if tokens.count == 0 {
            text = KSTextEmpty

        } else {
            var title = KSTextEmpty
            for token: KSToken in tokens {
                title += "\(token.title)\(_separatorText!)"
            }

            if (title.characters.count > 0) {
                //advance call made in the statement below
                title = title.substringWithRange(Range<String.Index>(start: advance(title.startIndex, 0), end: advance(title.endIndex, -_separatorText!.characters.count)))
            }

            let width = KSUtils.widthOfString(title, font: font!)
            if width + _leftViewRect().width > bounds.width {
                text = "\(tokens.count) \(_descriptionText)"
            } else {
                text = title
            }
        }
        break
    }
    _updatePlaceHolderVisibility()
}
编辑:算出了。获取第一个参数并对其调用advancedBy(n)。然后将第二个参数放入“n”槽中

示例:
let second:String=olderText!。substringFromIndex(olderText!.startIndex.advancedBy(range.location+1))作为字符串

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    // If backspace is pressed
    if (_tokenField.tokens.count > 0 && _tokenField.text == KSTextEmpty && string.isEmpty == true && shouldDeleteTokenOnBackspace) {
        if (_lastToken() != nil) {
            if (selectedToken() != nil) {
                deleteSelectedToken()
            } else {
                _tokenField.selectToken(_lastToken()!)
            }
        }
        return false
    }

    // Prevent removing KSEmptyString
    if (string.isEmpty == true && _tokenField.text == KSTextEmpty) {
        return false
    }

    var searchString: String
    let olderText = _tokenField.text

    // Check if character is removed at some index
    // Remove character at that index
    if (string.isEmpty) { //advance calls are made in this if statement
        let first: String = olderText!.substringToIndex(advance(olderText!.startIndex, range.location)) as String // advance called here (1/2)
        let second: String = olderText!.substringFromIndex(advance(olderText!.startIndex, range.location+1)) as String // advance called here (2/2)
        searchString = first + second

    }  else { // new character added
        if (tokenizingCharacters.contains(string) && olderText != KSTextEmpty && olderText!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) != "") {
            addTokenWithTitle(olderText!, tokenObject: nil)
            return false
        }
        searchString = olderText!+string
    }

    // Allow all other characters
    if (searchString.characters.count >= minimumCharactersToSearch && searchString != "\n") {
        _lastSearchString = searchString
        startSearchWithString(_lastSearchString)
    }
    _tokenField.scrollViewScrollToEnd()
    return true
}