簡體   English   中英

Swift類型'string.index'沒有下標成員

[英]Swift Type 'string.index' has no subscript members

我目前正在將C ++代碼轉換為Swift,但我只停留在一部分上。 傳遞給函數的參數是一個字符串,而我遇到的問題是嘗試根據字符串的倒數第二個字符設置變量以檢查某個字符時遇到的問題。

錯誤顯示在此行:

line[i-1]

我試過將此值強制轉換為Int,但這沒有用:

Int(line[i - 1])

我還嘗試查看采用Int的字符串的startIndex函數是否可以工作,但沒有成功:

line.startIndex[i - 1]

這是全部功能:

func scanStringForSpecificCharacters(line: String){

    var maxOpen: Int = 0;
    var minOpen: Int = 0;

    minOpen = 0;
    maxOpen = 0;
    var i = 0
    while i < line.characters.count {
        for character in line.characters {

            //var c: Character = line[i];
            if character == "(" {
                maxOpen += 1;
                if i == 0 || line[i - 1] != ":" {
                    minOpen += 1;
                }
            }
            else if character == ")"{
                minOpen = max(0,minOpen-1);
                if i == 0 || line[i-1] != ":"{
                    maxOpen -= 1;
                }
                if maxOpen < 0{
                    break;
                }
            }
        }

        if maxOpen >= 0 && minOpen == 0{
            print("YES")
        }else{
            print("NO")
        }
    }
}

Swift中的字符串不是索引集合,而是可以訪問以下四個不同視圖之一:字符,UTF8,UTF16或unicodescalars。

這是因為Swift支持Unicode,其中單個字符實際上可能由多個Unicode標量組成。

這是一篇真正幫助我解決這個問題的文章: https : //oleb.net/blog/2016/08/swift-3-strings/

無論如何,要回答您的問題,您將需要使用index(after:)index(before:)index(_, offsetBy:)創建索引。

在您的情況下,您想執行以下操作:

line.index(line.endIndex, offsetBy: -2) // second to last character

另外,您可能會發現使用String.Index類型而不是Int直接進行迭代更容易:

let line = "hello"

var i = line.startIndex
while i < line.endIndex {
    print(line[i])
    i = line.index(after: i)
}
// prints -> 
// h
// e
// l
// l
// o

在Swift中使用Strings的過程在其演變過程中已進行了多次更改,並且看起來根本不像C ++。 您不能通過下標字符串來獲取單個字符,應為此使用索引類。 我建議您閱讀這篇文章: https : //developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

正如在其他答案中已經指出的那樣,編譯器錯誤是由以下問題引起的:您無法使用整數索引Swift String

代碼中的另一個問題是您有一個嵌套循環 ,這可能不是故意的。

實際上,如果可能的話,我會盡量避免字符串索引,而只枚舉字符。 就您而言,您可以在單獨的變量中輕松跟蹤前面的字符:

var lastChar: Character = " " // Anything except ":"

for char in line.characters {
    if char == "(" {
        maxOpen += 1;
        if lastChar != ":" {
            minOpen += 1;
        }
    }

    // ...

    lastChar = char
}

或者,由於您只需要知道前面的字符是否為冒號:

var lastIsColon = false

for char in string.characters {
    if char == "(" {
        maxOpen += 1;
        if !lastIsColon {
            minOpen += 1;
        }
    }

    // ...

    lastIsColon = char == ":"
}

另一種可能的方法是並行迭代字符串和字符串的移動視圖:

for (lastChar, char) in zip([" ".characters, line.characters].joined(), line.characters) {

    // ...

}

正如其他人已經解釋的那樣,嘗試索引到Swift字符串是很痛苦的。 作為對代碼的最小更改,我建議您僅在前面的行中創建一個字符數組:

let linechars = Array(line.characters)

然后在需要索引到該行的任何地方,使用linechars

這個:

if i == 0 || line[i-1] != ":" {

變成:

if i == 0 || linechars[i-1] != ":" {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM