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

标签 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?

}

在我的一个 View Controller 中,我获取了 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)
}

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

我能做什么?

最佳答案

你是对的!应该有一种从元组数组中获取字典的方法。

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

关于arrays - 为什么我不能在 Swift 中将数组传递给可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625415/

相关文章:

java - JNA 是否允许通过引用或值将二维数组传递给 C?

ios - 如何让按钮在所有尺寸的单元格中都位于右侧?

ios - EXIF 的 PHContentEditingInputRequestOptions block 主线程

javascript - 将字符串拆分为具有交替一位和两位数字的数组

php - PHP 中根据 unicode 字符范围将字符串拆分为数组

objective-c - NSLayoutConstraint.constraintsWithVisualFormat 右下对齐

具有默认值的 C++ 可变参数模板函数参数

.net - C++/CLI中的变量参数列表

scala - 如何引用采用varargs的函数

c - 查找二维字符数组中的行数