我有这个功能:
func doStuff(stuff: Int...) {
print(stuff)
}
我称之为:
let array = [1, 2, 3]
doStuff(array)
它没有编译!
我的意思是,这没有任何意义,对吧?该函数应该接受一个事物列表,我给它一个事项列表。为什么这不起作用?
这里有一些背景信息(你可以跳过它)
我有这个NSManagedObject
子类:
class Entry: NSManagedObject {
override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
// irrelevent
}
convenience init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext, title: String, content: String, date: NSDate) {
// irrelevent
}
}
extension Entry {
@NSManaged var content: String?
@NSManaged var date: NSDate?
@NSManaged var title: String?
}
在我的一个视图控制器中,我获取了Entry
中的所有viewDidLoad
,并将获取的内容存储在名为anyObjs
的变量[AnyObject]
中
我想将此[AnyObject]
转为[NSDate: Entry]
,其中键是值{&#39}。 date
财产。我希望这样,以便使用Entry
轻松访问NSDate
。
所以我尝试了以下内容:
let literal = anyObjs!.map { (($0 as! Entry).date!, $0 as! Entry) }
entries = [NSDate: Entry](dictionaryLiteral: literal)
我发现我无法将[(NSDate, Entry)]
传递给(NSDate, Entry)...
!
"那很容易"你可能会说,"只需使用下标将数组中的所有元素作为varargs传递!"
doStuff(array[0], array[1], array[2])
但是,如果我不知道有多少物品,这不起作用。
另一种不起作用的解决方法是创建一个接受数组的函数:
func doStuff(array: [Int]) {
print(array)
}
这不起作用,因为如果我不知道函数的确切实现,我就无法在新函数中重写它。
我该怎么办?
答案 0 :(得分:1)
你是对的!应该有一种从元组数组中获取字典的方法。
extension Dictionary {
init(tuples: [Element]) {
self.init()
for (key, value) in tuples {
self.updateValue(value, forKey: key)
}
}
}
好的,现在已经完成了,让我们看看。
let tuples = anyObjs!.map { (($0 as! Entry).date!, $0 as! Entry) }
let entries = [NSDate: Entry](tuples: tuples)
或合并两行
let entries = [NSDate: Entry](tuples: anyObjs!.map { (($0 as! Entry).date!, $0 as! Entry) })