我在理解如何正确地在Swift中解包时遇到了麻烦。情况如下:
我有这两个类:
class Alpha
{
var val: Int
init(x: Int)
{
val = x
}
func doSomething() -> Int
{
// does stuff and returns an Int value
return val
}
}
和第二个类,它是第一个类的子类
class Beta: Alpha
{
var str: [String] = []
override init(x: Int)
{
super.init(x)
}
func doSomething() -> String
{
// does stuff and returns a String
return str
}
}
到目前为止一切顺利,这两个类按预期工作。但是现在我想创建一个字典来存储这些类对象中的几个。所以我创建了一个类来管理字典并向其添加项目。
class Gamma
{
var myDict: [String:AnyObject] = [:]
func addAlphaToDict(key: String, val: Int)
{
self.myDict[key] = Alpha(x: val).self
}
func addBetaToDict(key: String, val: Int)
{
self.myDict[key] = Beta(x: val).self
}
}
这也有效,但我认为这可以以某种方式得到改善。我现在遇到的问题是当我尝试访问字典中的值时:
var foo = Gamma()
foo.addAlphaToDict(key: "blah", val: 45)
foo.addBetaToDict(key: "bluh", val: 23)
var result1 = (foo.myDict["blah"] as! Alpha).doSomething()
var result2 = (foo.myDict["bluh"] as! Beta).doSomething()
我发现这里的语法非常笨重,我觉得我做错了,即使它有效。我是一名经验丰富的开发人员,但刚刚开始使用Swift,所以我对某些事情并不十分确定。拥有更多Swift经验的人能告诉我如何改进这些代码,或者指出我应该走向的方向吗?谢谢!
如果你想要一个具有有限数量可能性的异构类型,那么更喜欢将enum
与Any
或AnyObject
相关联的值。然后,您可以使用switch
以详尽且安全的方式恢复类型。
import UIKit
import PlaygroundSupport
enum DictionaryValues {
case integer(Int), string(String)
}
let dictionary: [String: DictionaryValues] = ["a": .integer(1), "b": .string("xyz")]
for (key, value) in dictionary {
switch value {
case .integer(let number):
print("Key \(key) is a number: \(number)")
case .string(let text):
print("Key \(key) is text: \(text)")
}
}
在这种情况下,您可以使用Alpha
而不是AnyObject
作为字典值。只要在需要的时候将它转发给Beta
。应尽可能避免使用AnyObject
或Any
作为字典键。
但是,我不得不说这种做法很糟糕。您需要有一个更清晰的逻辑来决定密钥何时是Beta
,而不仅仅是知道您传递给字典的密钥。