我试图进入Swifty方式而不是翻译Obj-C的习惯。了解Swift的关闭类型要求
我正在用Parse做一个项目,并且在获取一堆Parse对象之后,我想先对它们进行排序,然后从它们中提取特定的属性。这就是我想现在:
if let notifications = fetchedObjects as? [PFObject] {
// This line tells me "Cannot invoke 'sorted' with an argument list of type '((_, _) -> _)'
let sortedMessages: [String] = notifications.sorted { $0.createdAt.compare($1.createdAt) == .OrderedAscending }
}
PFObject
宣布这样的createdAt
属性:var createdAt: NSDate? { get }
。
我在这里错过了与Swift的类型检查混淆?
这是我想要的东西搞清楚上述错误之后:
if let notifications = fetchedObjects as? [PFObject] {
let sortedMessages: [String] = notifications.sorted({ $0.createdAt.compare($1.createdAt) == .OrderedAscending }).map { $0["message"] }
}
这在我看来就像所有类型应该明确和匹配。
UPDATE
我回到这个今天得到它的工作。我没有把它写在我原来的职位,但我昨天试图强行拆礼物createdAt
可选太:
if let notifications = fetchedObjects as? [PFObject] {
// This line tells me "Cannot invoke 'sorted' with an argument list of type '((_, _) -> _)'
let sortedMessages: [String] = notifications.sorted { $0.createdAt!.compare($1.createdAt!) == .OrderedAscending }
}
这是给我确切的同样的错误。到目前为止,我学习玩Swift的一件事是,当它给出隐藏类型不匹配错误时,最好将类型声明显式添加到每个变量 - 这通常会导致更具体的错误消息。所以,今天我写了上面这样的代码:
if let notifications = objects as? [PFObject] {
let sortedMessages: [String] = notifications.sorted { (lhs: PFObject, rhs: PFObject) -> Bool in
return rhs.createdAt!.compare(lhs.createdAt!) == .OrderedAscending
}.map { $0["message"] as! String }
}
这似乎编译没有问题。但是,如果我依靠类型推断:
if let notifications = objects as? [PFObject] {
let sortedMessages: [String] = notifications.sorted { lhs, rhs in
return rhs.createdAt!.compare(lhs.createdAt!) == .OrderedAscending
}.map { $0["message"] as! String }
}
我得到map
的错误:Cannot invoke 'map' with an argument list of type '((_) -> _)'
。
在我看来是这样的:
if let notifications = objects as? [PFObject] {
let sortedMessages: [String] = notifications.sorted { $0.createdAt!.compare($1.createdAt!) == .OrderedAscending }
.map { $0["message"] as! String }
}
应该是有效的,但斯威夫特的类型推断是不及格可是...(?)。我不能让自己摆脱困境并责怪语言,但在这种情况下看起来很合理。我错过了什么吗?
什么类型不'$ 0“消息”]'回来吗? 'AnyObject!'? – pwightman 2015-04-02 14:33:36
正确。 'AnyObject!'。 – Shinigami 2015-04-02 21:21:00