我想在类型为[String:SomeClass]的Dictionary中存储一个更专业的类型.下面是一些说明我的问题的示例代码(也可以在https://swiftlang.ng.bluemix.net/#/repl/579756cf9966ba6275fc794a上进行):
class Thing<T> {}
protocol Flavor {}
class Vanilla: Flavor {}
var dict = [String:Thing<Flavor>]()
dict["foo"] = Thing<Vanilla>()
Run Code Online (Sandbox Code Playgroud)
它会产生错误ERROR at line 9, col 28: cannot assign value of type 'Thing<Vanilla>' to type 'Thing<Any>?'.
我已经尝试过铸造,Thing<Vanilla>() as Thing<Flavor>但这会产生错误cannot convert value of type 'Thing<Vanilla>' to type 'Thing<Flavor>' in coercion.
我也尝试将Dictionary定义为类型,[String:Thing<Any>]但也不会改变任何东西.
如何在Thing不诉诸普通的情况下创建不同s 的集合[String:AnyObject]?
我还应该提一下,Thing我没有定义类(实际上它是关于BoltsSwift Task的),因此创建Thing没有类型参数的基类的解决方案不起作用.
A Thing<Vanilla>不是Thing<Flavor>.Thing是不协变的.斯威夫特没有办法表达这Thing是协变的.这有很好的理由.如果您要求的内容在没有仔细规则的情况下被允许,我将被允许编写以下代码:
func addElement(array: inout [Any], object: Any) {
array.append(object)
}
var intArray: [Int] = [1]
addElement(array: &intArray, object: "Stuff")
Run Code Online (Sandbox Code Playgroud)
Int是一个子类型Any,所以如果[Int]是子类型[Any],我可以使用这个函数将字符串附加到一个int数组.这打破了类型系统.不要那样做.
根据您的具体情况,有两种解决方案.如果是值类型,则重新打包:
let thing = Thing<Vanilla>(value: Vanilla())
dict["foo"] = Thing(value: thing.value)
Run Code Online (Sandbox Code Playgroud)
如果是参考类型,请使用类型橡皮擦将其装箱.例如:
// struct unless you have to make this a class to fit into the system,
// but then it may be a bit more complicated
struct AnyThing {
let _value: () -> Flavor
var value: Flavor { return _value() }
init<T: Flavor>(thing: Thing<T>) {
_value = { return thing.value }
}
}
var dict = [String:AnyThing]()
dict["foo"] = AnyThing(thing: Thing<Vanilla>(value: Vanilla()))
Run Code Online (Sandbox Code Playgroud)
橡皮擦类型的细节可能会有所不同,具体取决于您的基础类型.
顺便说一句:围绕这个的诊断已经相当不错了.如果您尝试addElement在Xcode 9中调用我的上述内容,则会得到以下结果:
Cannot pass immutable value as inout argument: implicit conversion from '[Int]' to '[Any]' requires a temporary
Run Code Online (Sandbox Code Playgroud)
这告诉你的是,Swift愿意将[Int]你要求的地方[Any]作为Arrays的特例 - 尽管这种特殊处理并没有扩展到其他泛型类型.但它只允许通过制作数组的临时(不可变)副本.(这是另一个很难推理Swift性能的例子.在其他语言看起来像"cast"的情况下,Swift可能会复制.或者它可能没有.很难确定.)
| 归档时间: |
|
| 查看次数: |
1593 次 |
| 最近记录: |