类型*我的自定义类*没有下标成员

时间:2016-01-08 01:08:03

标签: swift properties

这是一个我即将发布完毕答案的问题,但似乎作者只是在那一刻删除了这个问题,可能因为唯一的回复是评论说这是不可能的。我自己发现问题的技术方面有点有趣,所以我在这里添加相同的问题和答案,以防其他人发现这件事。

随时编辑此帖子/主题及其答案。另外,我已经在meta中查看了以这种方式重新发布已删除问题的指南,但是没有找到任何明确的非建议。如果我在这里错了,请告诉我。

(来自SO用户的原始问题Jaime

输入我的自定义类没有下标成员

我试图做一些javascript-esque代码并且它已经爆炸了。

class Product {

    var name : String!
    var type: String!
    var description: String!
    var taste: String!
    var picturePath: String!
    var pairings: [String]
    var similar: [String]

    init(dict: Dictionary<String, AnyObject>) {
        let props = ["name", "type", "description", "taste", "pairings", "similar"]
        for prop in props {
            self[prop] = dict[prop]
        }
    }
}

有没有办法做我在这里尝试做的事情,或者我必须手动初始化该类的所有属性,例如。

if let title = dict["name"] as? String {
        self.title = title
    }
//... and so on

1 个答案:

答案 0 :(得分:0)

首先:正如亚历克斯在对原始问题的评论中写道的那样,通常应该避免这种情况。

  

用&#34; no&#34;回答问题感觉很奇怪。即使它是   可能,它不是类型安全的,或者它需要它   只需编写初始化程序,您就可以做得更好   用手。 Swift经常不利于编写Javascript-esque   代码,因为它是静态的,强类型的。

无论如何, 可以在Mirror(反思自我)和整齐的obj-c的帮助下做到这一点。让你的班级继承自NSObject

class Product : NSObject {

    var varDump: AnyObject?
    var name : String?
    var type: String?
    // ...

    init(dict: Dictionary<String, AnyObject>) {
        super.init()

        let a = Mirror(reflecting: self).children.filter { $0.label != nil }
        for b in a {
            self.setValue(dict[(b.label ?? "")], forKey: (b.label ?? "varDump"))
        }
    }

}

var propertyInit = [String:AnyObject]()
propertyInit["name"] = "John"
propertyInit["type"] = "Human"

var a = Product(dict: propertyInit)

print(a.name ?? "Not initalized") // John
print(a.type ?? "Not initalized") // Human

除了NSObject继承之外,您还会看到您希望以这种方式初始化的所有属性都已设置为上面的可选项。这很自然是因为如果您实际初始化这些属性,swift在运行时才能知道,因此如果将它们标记为非可选项,则会产生编译时错误。

最后,请再次注意Alex在评论中所写的内容(引用),并将此答案视为某事的技巧,但实际上并不是如果您想要遵循常见的建议斯威夫特会议。如果你在dict初始化时不太小心,这个代码很容易在运行时中断,因为你完全放松了类型安全。