Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Swift中的[String:Class]类型的Dictionary中存储Class类型的值?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我想在类型为[String:someClass]的Dictionary中存储一个更专业的类型.下面是一些说明我的问题的示例代码(也可以在 https://swiftlang.ng.bluemix.net/#/rePL/579756cf9966ba6275fc794a处玩): class Thing<T> {} protocol Flavor {} class Vanilla: Flavor {
我想在类型为[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>()

它在第9行产生错误ERROR,第28行:不能指定类型’Thing< Vanilla>‘的值输入’Thing< Any>?’.

我已经尝试将Thing< Vanilla>()作为Thing< Flavor>但是产生的错误无法转换’Thing< Vanilla>‘类型的值输入’Thing< Flavor>‘在胁迫中.

我也尝试将Dictionary定义为类型[String:Thing< Any>],但这也没有改变任何东西.

如何在不诉诸普通[String:AnyObject]的情况下创建不同事物的集合?

我还要提一下,我没有定义类Thing(事实上它是关于BoltsSwift任务),因此在没有类型参数的情况下创建Thing基类的解决方案不起作用.

解决方法

A Thing< Vanilla>不是事物<风味>.事情不协变. Swift没有办法表达Thing是协变的.这有很好的理由.如果您要求的内容在没有仔细规则的情况下被允许,我将被允许编写以下代码

func addElement(array: inout [Any],object: Any) {
    array.append(object)
}

var intArray: [Int] = [1]
addElement(array: &intArray,object: "stuff")

Int是Any的子类型,因此如果[Int]是[Any]的子类型,我可以使用此函数将字符串附加到int数组.这打破了类型系统.不要那样做.

根据您的具体情况,有两种解决方案.如果是值类型,则重新打包:

let thing = Thing<Vanilla>(value: Vanilla())
Dict["foo"] = Thing(value: thing.value)

如果是引用类型,请将其装入type eraser.例如:

// 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()))

橡皮擦类型的细节可能会有所不同,具体取决于您的基础类型.

便说一句:围绕这个的诊断已经相当不错了.如果你试图在Xcode 9中调用我的addElement,你得到这个:

CAnnot pass immutable value as inout argument: implicit conversion from '[Int]' to '[Any]' requires a temporary

这告诉你的是,Swift愿意传递[Int],你要求[Any]作为Arrays的特例(尽管这种特殊处理并没有扩展到其他泛型类型).但它只允许通过制作数组的临时(不可变)副本. (这是另一个很难推理Swift性能的例子.在其他语言看起来像“cast”的情况下,Swift可能会复制.或者它可能没有.很难确定.)

大佬总结

以上是大佬教程为你收集整理的如何在Swift中的[String:Class]类型的Dictionary中存储Class类型的值?全部内容,希望文章能够帮你解决如何在Swift中的[String:Class]类型的Dictionary中存储Class类型的值?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。