Swift Array.sort() 不接受速记格式的闭包

Swift Array.sort() won't accept closure in shorthand format

提问人:Erik P. Hansen 提问时间:6/8/2015 最后编辑:Jonathan LefflerErik P. Hansen 更新时间:7/25/2015 访问量:873

问:

我在使用 Array.sort() 函数时遇到了一个奇怪的问题。它不接受速记闭包。Xcode 在使用速记闭包时会抱怨以下消息: 但它适用于相同闭包的较长形式。Cannot invoke 'sort' with an argument list of type '((_, _) -> _)'

var names = ["Al", "Mike", "Clint", "Bob"]

// This `sort()` function call fails:
names.sort {
    $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending
}

// This `sort()` function call works:
names.sort { (first: String, second: String) in
    return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending
}

为了让事情变得更加奇怪,如果我先使用闭包的长形式,然后使用速记形式再次排序,它就可以正常工作了!

var names = ["Al", "Mike", "Clint", "Bob"]

// Works fine, orders the array alphabetically
names.sort { (first: String, second: String) in
    return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending
}

// This shorthand version now works as well, reversing the order of the array
names.sort {
    $0.localizedCaseInsensitiveCompare($1) == .OrderedDescending
}

所以,最好的情况是,我做错了什么,可以学到一些东西。最坏的情况是,这只是 Xcode 或 Swift 的一个愚蠢的错误。

有什么想法吗?

快速 关闭

评论

0赞 Airspeed Velocity 6/8/2015
好吧,这非常奇怪,绝对是编译器错误。你应该把它归档
0赞 Airspeed Velocity 6/8/2015
我原以为它会是一个游乐场的事情,但同样的切换顺序和编译的事情也会发生。swiftc
1赞 Airspeed Velocity 6/8/2015
有趣。如果您只是在文件顶部粘贴任何类型的引用(会这样做),这也解决了第一个示例的问题。就好像隐式成员表达式功能需要“启动”,并更显式地引用枚举类型,然后才能起作用。因此,对表达式进行重新排序可以修复它。NSComparisonResultlet x: NSComparisonResult
1赞 Martin R 6/8/2015
localizedCaseInsensitiveCompare其实是 的 一个 Foundation 方法。似乎自动桥接不知何故不起作用。在编译该代码之前引用任何 Foundation 方法就足够了,例如 .NSStringlet s = NSString()
1赞 Airspeed Velocity 6/9/2015
啊和...它已修复在今天发布的 2.0 :) // @MartinR

答:

-1赞 ergoon 6/15/2015 #1

正如 R 指出@Martin,问题的根源在于,您正在对 Swift String 类型调用 NSString 的方法。

这工作正常

names.sort {
    $0 <= $1
}

评论

0赞 Erik P. Hansen 6/17/2015
有两件事:首先,Swift String 和 NSString 应该是免费桥接的,因此在 Swift String 上调用 NSString 方法将起作用。或者至少它应该如此。其次,您使用的比较方法(用于比较两个字符串)与不区分大小写的比较不同。<=