Xcode 8 beta 6 swift 3 localizedCaseInsensitiveCompare

问题描述:

此代码在Xcode 8 beta 5上编译,但在beta 6中损坏。什么是正确的新Swift 3方式来做这种比较?Xcode 8 beta 6 swift 3 localizedCaseInsensitiveCompare

self.categories = categories.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedDescending } 

的错误是

Argument passes to call that takes no arguments

+0

如果错误信息真的很糟糕,可能要在bugs.swift.org上提交一个错误。它指出它在说什么? – jtbandes

+0

该代码适用于我,但文档建议使用排序(按: jjatie

+0

你可以在Swift 3中使用'sort'而不用'ed'来排序。 'categories.sort {$ 0.localizedCaseInsensitiveCompare($ 1)== .orderedDescending}' –

我已经成功获得同样的错误消息。

在我的测试代码,如果我声明实例属性categories为:

var categories: [NSString] = [] 

我有此错误消息:

error: argument passed to call that takes no arguments

如果你的情况很相似,这一点,你需要将财产声明更改为:

var categories: [String] = [] 

即使这不适合您问题,您最好检查一下这种类型不匹配的,因为斯威夫特3测试版6/8的Xcode:

​​

(从发行说明两者的Xcode 8测试版6)

+0

问题是self.categories是一个NSArray ?.我认为这个问题与排序命令有关,因为它讨论了参数。 –

+0

@JasonHocker,Swift 3正在迅速发展,Swift团队没有时间去完善它的诊断信息。当Swift找不到匹配的'sorted'超载时,它会返回一个预期的类型(在你的情况下是'NSArray'?),它有时会输出这种不足且令人困惑的信息。我认为这种糟糕的诊断应该被视为bug,并且您最好向Apple或swift.org发送错误报告。 – OOPer

同问题在这里。我试图从Xcode beta官方Swift 3指南中编译一段代码,并得到相同的错误 - Argument passes to call that takes no arguments。但是,当我使用IBM Swift Sandbox时,它已成功编译。

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 
func backward(_ s1: String, _ s2: String) -> Bool { 
return s1 > s2 
} 
var reversedNames = names.sorted(by: backward) 

从寻找here,似乎从 x.sorted排序改变了API(isOrderedBefore:>)来x.sorted(按:>)。我想在未来的Xcode测试版中,这将被照顾。

+0

另一种书写方式: var reversedNames = names.sorted(by:{s1,s2 - > Bool in s1> s2}) – Edudjr