Swift中,类型为'String'的值没有名为'range'的成员。

5

我相信我遇到了Swift版本问题,但我不太确定。代码在我的Xcode平台上可以工作,但在在线Swift编译器中无法工作。有其他人遇到过这个问题或知道我可以用什么替换以下检查字符的行吗?

if i == 0 || !((line.range(of: ":") != nil)) 

这是我的代码:
import Foundation



func hackTheString(line: String){

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

        minOpen = 0
        maxOpen = 0
        let i = 0
        while i < line.characters.count {
            for character in line.characters {
                if character == "(" {
                    maxOpen += 1
                    if i == 0 || !((line.range(of: ":") != nil)) {
                        minOpen += 1
                        }
                    }
                else if character == ")"{
                    minOpen = max(0,minOpen-1)

                    if i == 0 || !((line.range(of: ":") != nil)){
                        maxOpen -= 1;
                        }
                    if maxOpen < 0{
                        break
                    }
                }
            }

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


while let line = readLine() {


    print(hackTheString(line))

}

在线编译器给出的错误信息如下:
source.swift:17:37: error: value of type 'String' has no member 'range'
                    if i == 0 || !((line.range(of: ":") != nil)) {
                                    ^~~~ ~~~~~
source.swift:24:37: error: value of type 'String' has no member 'range'
                    if i == 0 || !((line.range(of: ":") != nil)){
                                    ^~~~ ~~~~~

1
你正在使用的在线服务是否提供了特定的错误信息?如果有,请在你的问题中包含它。 - MathewS
抱歉,@MathewS。 - Laurence Wingo
2
听起来你的在线编译器正在使用Swift 2。尝试使用 line.rangeOfString(":") - rmaddy
1
你为什么要写 !((line.range(of: ":") != nil)) 呢?这和 line.range(of: ":") == nil 是一样的。为什么要双重否定?为什么要多加一组括号? - rmaddy
@rmaddy 谢谢,我会尝试一下。Xcode提供了建议,我非常渴望看到错误消失并进行测试。现在我正在想方设法找出哪里出错了,导致它一遍又一遍地返回我的答案。 - Laurence Wingo
我通过添加break语句和添加line.range函数来修复了代码,但是这样做引发了另一个错误,提示类型字符串没有成员range。@rmaddy - Laurence Wingo
1个回答

7

我在 IBM 的在线 Swift 编译器上使用了 range(of:) 函数,并确保写了 import Foundation,它完全成功了。然后我尝试使用以下代码查看该在线编译器使用的 Swift 版本:

#if swift(>=3.0)
print("Hello, Swift 3!")
#elseif swift(>=2.2)
print("Hello, Swift 2.2!")
#elseif swift(>=2.1)
print("Hello, Swift 2.1!")
#endif

那么我了解到我尝试使用的在线编译器是使用Swift 3,因此该函数运行完美。请检查您的在线编译器使用的版本,并使用与该版本特定的函数。现在你可以做的另一件事是使用字符串的字符数组,并找到你的字符的索引。因此,您的代码可能如下所示:
if i == 0 || !((line.characters.index(of: ":") != nil)) {
                        minOpen += 1          
}

感谢@The Rohan Sanap的回复,但是它不允许我检查Swift版本。当我进行推荐的更改时,它会产生一个新的错误,内容为:“error: value of type 'String.CharacterView' has no member 'index'”。我已经正确导入了Foundation。 - Laurence Wingo
1
根据您在上面的评论中所说,我怀疑您的编译器使用的是Swift 2.x。尝试使用函数line.characters.indexOf(":") - Rohan Sanap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接