为什么我不能将数组传递给Swift中的vararg?

时间:2016-06-04 01:15:18

标签: arrays swift variadic-functions

我有这个功能:

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)
}

这不起作用,因为如果我不知道函数的确切实现,我就无法在新函数中重写它。

我该怎么办?

1 个答案:

答案 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) })