为什么我不能在Swift中将数组传递给可变参数?

3

我有这个函数:

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?

}

在我的一个视图控制器中,我在viewDidLoad中获取所有的Entry并将其存储在名为anyObjs的变量中,该变量的类型为[AnyObject]
我想将这个[AnyObject]转换成一个[NSDate: Entry],其中键是值的date属性。我希望以这种方式进行,以便可以轻松地使用NSDate访问Entry
所以我尝试了以下方法:
let literal = anyObjs!.map { (($0 as! Entry).date!, $0 as! Entry) }
entries = [NSDate: Entry](dictionaryLiteral: literal)

我发现无法将[(NSDate,Entry)]传递给(NSDate,Entry)...


“那很容易”,你可能会说,“只需使用下标将数组中的所有元素作为可变参数传递!”

doStuff(array[0], array[1], array[2])

但如果我不知道有多少项,那么这种方法就行不通。

另一个无法解决问题的变通方法是创建一个接受数组的函数:

func doStuff(array: [Int]) {
    print(array)
}

这也不行,因为如果我不知道函数的确切实现方式,就无法在新函数中重写它。
我该怎么办?

1个回答

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

1
但是如果我不知道一个方法的确切实现呢?那么我就无法将其重写为接受数组的方法。或者我可以吗? - Sweeper
@Sweeper 你可以向 swift-evolution 提出可变参数展开的建议,但考虑到他们已经批准了从函数应用中删除隐式元组展开行为,我认为他们会拒绝这个提案。 - Jeffery Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接