【问题标题】:Error: value of tuple type '(NSString, NSString)' has no member '0'错误:元组类型“(NSString,NSString)”的值没有成员“0”
【发布时间】:2016-01-17 16:58:04
【问题描述】:

我正在尝试修改一些一年前运行良好的 Swift 源代码;但是自从 Apple 发布了 Swift 2.0 之后,Xcode 拒绝直接运行我现有的代码;坚持要我更新它以使用新的 Swift。感谢苹果。

那么,谁能解释一下这个完全愚蠢的错误?

元组类型'(NSString, NSString)'的值没有成员'0'

失败的代码行:

if let match = (try Filesystem.GetMounts()?.filter { 
        mapping["pattern"] != nil ? try $0.0 =~ mapping["pattern"]! : $0.0 as String == uncpath! 
    }.values.array.first) {
    ...
}

GetMounts 函数签名:

class func GetMounts() throws -> [NSString:NSString]?

正则表达式运算符:

func =~(string:NSString, regex:NSRegularExpression) -> Bool {
    let matches = regex.numberOfMatchesInString(string as String, options: [], range: NSMakeRange(0, string.length))
    return matches > 0
}
func =~(string:NSString, pattern:NSString) throws -> Bool {
    let matches = try NSRegularExpression(pattern: pattern as String, options: NSRegularExpressionOptions.DotMatchesLineSeparators).numberOfMatchesInString(string as String, options: [], range: NSMakeRange(0, string.length))
    return matches > 0
}
func =~(string:NSString, pattern:String) throws -> Bool {
    let matches = try NSRegularExpression(pattern: pattern as String, options: NSRegularExpressionOptions.DotMatchesLineSeparators).numberOfMatchesInString(string as String, options: [], range: NSMakeRange(0, string.length))
    return matches > 0
}

【问题讨论】:

  • 你在一行代码中做的太多了。还有=~是什么我只知道~=!?
  • 尝试分成几行并将其移出 if 条件。该代码应该分成 3 到 5 行。
  • =~ 是我写的一个辅助运算符,因为我不喜欢内置的运算符。此外,虽然将它分成多行可能是个好主意,但它没有办法在这里帮助我。我不是要求更正我的编程风格,我是在问为什么 Xcode 对我撒谎!
  • @SodAlmighty 拆分为多行以及创建一个可验证的示例将帮助您,至少,让我们其他 SO 成员更轻松地尝试帮助您。
  • 把它分成多行,你会发现这对你有很大帮助。这里可能有一些编译错误,Xcode 只是很困惑,它假设某些东西是因为你写了一些错误的东西,并且这个假设变成了错误消息 - 拆分我们的代码,你会得到更好的错误报告。

标签: xcode swift compiler-errors tuples


【解决方案1】:

问题是您试图从元组数组(NSString:NSString) 中提取不存在的属性.values。然而,这个真正的错误被抱怨 .0 元组的成员所掩盖。

例如以下会产生与您得到的相同的错误:

let a: [NSString:NSString] = ["Hello":"World", "foo":"bar"]

let opt : Int? = 1
if let b = (a.filter() {
    opt != nil ? $0.0 == "Hello" : $0.0 as String == "foo"
    }.values.array.first) { // <-- actual error
        // ...
}

而以下不是:

let a: [NSString:NSString] = ["Hello":"World", "foo":"bar"]

let opt : Int? = 1
if let b = (a.filter() {
    opt != nil ? $0.0 == "Hello" : $0.0 as String == "foo"
    }.first) {
        print(b) // (Hello, World)
}

【讨论】:

  • 是的,就是这样!当然,在 Apple 更改语言之前它运行良好。我不明白的是,为什么会出现这个特定错误?我意识到编译器很困惑,因此错误消息可能不是 100% 适用于该问题;但这并没有解释为什么它选择了一条不言而喻的错误消息!
  • @SodAlmighty 当遇到看似没有意义的错误消息时,您可能会将其作为经验法则:函数式编程、闭包和链接都是强大的工具,但它确实做到了当单行(包含大量操作)失败(快速编译器的一个已知“弱点”)时,编译器很难准确地指出失败的原因。因此,如果不是为了代码可读性,而是为了更容易调试,可能会将非常复杂的行拆分为多行。或者;当你遇到这样的错误时:调试时拆分东西。
猜你喜欢
  • 2018-03-21
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多