在Swift init()中初始化类型为不可变字典的属性

时间:2015-08-19 13:52:14

标签: swift initialization immutability swift2 access-control

我想通过计算init()中的值来初始化不可变字典。我目前有:

class MyClass {
    var images: [String: UIImage]

    func init() {
        images = [:]
        for // ... loop over strings
            // ... calculate image
            images[string] = image
    }
}

有没有办法用let而不是var语义定义此属性。这将是方便的并且看起来合适,因为在初始化对象之后其内容将不会被更改。 (如果我只是将此var更改为let我当前在循环内的分配中收到此错误:“不可变值'self.images'可能不会分配给”。)

2 个答案:

答案 0 :(得分:2)

init中添加一个额外变量并将其分配给images

class MyClass {
    let images: [String: UIImage]

    func init() {
        var tempImages = [String: UIImage]()
        for // ... loop over strings
            // ... calculate image
            tempImages[string] = image

        // assign tempImages to images
        images = tempImages
    }
}

答案 1 :(得分:1)

如果在字典计算期间不需要self,则另一个选项是使用初始化块。

class MyClass {

    let images: [String: UIImage] = {
        var images = [String: UIImage]()
        images["foo"] = UIImage(named: "foo")
        images["bar"] = UIImage(named: "bar")
        return images
    }()

    // no explicit init required

}