版本1:
var anything: Anyanything = "woof"
有道理……任何类型,值类型或引用类型.
但是,如果我们创建一个像Double?这样的可选变量,则此代码会抛出警告:
版本2:
var anything: Anylet aDouble: Double? = 3anything = aDouble
但是这段代码没有发出警告:
版本3:
enum AnEnum<T>: { case first case second (T)}var anEnum: AnEnum<String> = .firstanything = anEnum
您可以合理化版本2抛出警告,因为Any不是Optional类型,而Double?是一个可选类型.尝试将Optional分配给非可选类型是一种类型不匹配.
但是,在封面下,Optional是带有.none大小写的枚举,并且带有.some大小写,其中.some大小写具有关联值.我的版本3使用枚举AnEnum,它也有2个案例,其中第二个具有相关值. AnEnum类型与Swift本机Optional类型几乎相同.
为什么将AnEnum值赋值给任何好的,但是为任何东西分配一个Optional值都不行?
(我开始回答这个问题:Swift dictionary with mix types (optional and non-optional))
然后意识到我真的不知道答案.
解决方法 可选不仅仅是一个枚举.它也是每种类型的隐含促销.任何和可选的组合以奇怪的方式可能令人惊讶.例如,T?是的.牛逼?也是任意的. Any是Any,Any?是的.任何??也是任意的.这会产生一些令人头疼的问题,而细微的上传和下线让人们很难清楚Any的选择性究竟是什么.例如.
var anything: Any = ""let aDouble: Double? = 3anything = aDouble as Anylet x = anything as? Double
这是什么?好吧,aDouble是可选的< Double>,而不是Double,所以? Double应返回nil.但它并不是因为魔术.它返回Optional(3).坦率地说这很奇怪(尝试用一个版本的MyOptional作为枚举来获得相同的东西),但另一方面它会非常糟糕.考虑:
let data: [String: Any] = ["aDouble": aDouble]let y = data["aDouble"] as? Double
你是双?在这里,不是双??因为可选的合并.谢天谢地.但这很奇怪.如果你的泛型涉及基于Optional的一致性,这可能会让人感到困惑(而且确实如此;有很多问题出现在那里……)现在用Any替换上面的Double,它真的很快就开始了.
所以编译器警告你将Any与Optional混合是一个坏主意,并且可能导致奇怪的类型结果,并且你肯定应该在任何时候调用它. (也许你应该停止使用Any,因为它几乎不是你真正的意思.)
为了使它成为我能想到的最具体的例子,请考虑:
var anything: Any = ""let one: Int = 1let maybeTwo: Int? = 2anything = oneanything as? Int // fineanything = maybeTwoanything as? Int? // illegal (see below)anything as? Int // fine (but why? that's not what we put in.)
你会认为这是平行的,但事实并非如此.当你将Optionals投入混音时,你不能只提出你输入的类型.
顺便说一句,有趣的附录,你不能从Any转换为可选类型.
let x = anything as? Double? // Illegal
这真的很有趣,因为任何东西都是Double?:
(lldb) p anything(Any) $R4 = { payload_data_0 = 0x4008000000000000 payload_data_1 = 0x0000000000000000 payload_data_2 = 0x0000000000000000 instance_type = Double?}
那么我怎么能区分“任何东西是双重的?但是没有”与“任何东西是字符串”之间的区别?你认为你可以测试一下,但我认为你不能,因为这一切都不能持续.相反,它试图方便.但是你不能太用力或者所有接缝都会显示出来.
总结以上是内存溢出为你收集整理的swift – 为什么不能在没有警告的情况下为“Any”类型的变量分配Optional?全部内容,希望文章能够帮你解决swift – 为什么不能在没有警告的情况下为“Any”类型的变量分配Optional?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)