Xcode 错误:元组类型的值';(NSString,NSString)和#x27;没有成员';0';

Xcode 错误:元组类型的值';(NSString,NSString)和#x27;没有成员';0';,xcode,swift,compiler-errors,tuples,Xcode,Swift,Compiler Errors,Tuples,我正试图修改一些一年前运行良好的Swift来源;但自从苹果发布Swift 2.0以来,Xcode直接拒绝运行我现有的代码;坚持要我更新它以配合新的Swift。谢谢苹果 那么,有人能解释一下这个愚蠢的错误吗 元组类型“(NSString,NSString)”的值没有成员“0” 失败的代码行: if let match = (try Filesystem.GetMounts()?.filter { mapping["pattern"] != nil ? try $0.0 =~ ma

我正试图修改一些一年前运行良好的Swift来源;但自从苹果发布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]?
regex运营商:

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
}

问题是您试图从元组数组
(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
        // ...
}

您在一行代码中做了太多的faaaaar。什么是
=~
我只知道
~=
!?尝试分成几行,并将其移出if条件。那段代码应该分成3到5行。
=~
是我写的一个辅助操作符,因为我不喜欢内置的。此外,虽然将其拆分为多行可能是一个好主意,但在这方面对我毫无帮助。我不是在要求纠正我的编程风格,我是在问为什么Xcode对我撒谎@Sodalmaghty拆分成多行并创建一个可验证的示例将帮助您,至少,让我们其他成员更容易尝试帮助您。将其拆分成多行,您将看到这对您有很大帮助。这里可能有一些编译错误,Xcode只是非常混乱,它假设了一些东西,因为您编写了一些有错误的东西,这种假设会变成错误消息-拆分我们的代码,您将得到更好的错误报告。是的,就是这样!当然,在苹果改变语言之前,它运作良好。我不明白的是,为什么会有这样的错误?我意识到编译器正在变得混乱,因此错误消息可能不是100%适用于该问题;但这并不能解释为什么它选择了一条毫无意义的错误消息@Sodalmanty当你遇到看似毫无意义的错误消息时,你可能会将此作为一条经验法则:函数编程、闭包和链接都是强大的工具,但这确实让编译器很难准确地指出当一行(包含大量操作)失败时失败的内容(swift编译器的一个已知“弱点”)。因此,如果不是为了代码可读性,而是为了便于调试,可能会将非常复杂的行拆分为多行。或者,当您遇到类似这样一行的错误时:在调试时拆分内容。
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)
}