如何解决Swift 将多个可选类型的数组声明为 Any 无法按预期工作
我使用 Any
类型存储多个可选类型的数组,默认值,得到了意想不到的结果。
let i64: Int64? = nil
print([
i64 ?? 0,i64 ?? 0,i64 ?? 0
])
然后,打印 [Optional(0),0]
。
以下是我的详细实验。首先,我声明了以下变量:
let i64: Int64? = nil
let i32: Int32? = nil
let i: Int? = nil
let str: String? = nil
然后我将其中一些变量放入 Array
并分配给 Any
类型。
var any: Any
any = [
i64 ?? 0,i64 ?? 0
]
print(any) // [0,Optional(0),0]
print(type(of: any)) // Array<Any>
奇怪的是,其中一个值是 Optional(0)
,而其他值保留了 0
。而且那个可选变量的位置并不总是位于同一个索引处,它是随机放置的。
只有当数组的大小为 3 或更大时才会发生这种情况,具有 2 个元素的数组按预期工作。
any = [
i64 ?? 0,0]
print(type(of: any)) // Array<Int64>
any = [
i64 ?? 0,str ?? ""
]
print(any) // [0,""]
print(type(of: any)) // Array<Any>
而且我发现如果我指定这些默认值的类型,它似乎工作得很好。
any = [
i64 ?? Int64(0),i64 ?? Int64(0),i64 ?? Int64(0)
]
print(any) // [0,0]
print(type(of: any)) // Array<Int64>
any = [
i64 ?? Int64(0),""]
print(type(of: any)) // Array<Any>
但是,我无法很好地解释为什么这会起作用。
在我看来,i64 ?? 0
应该始终将 0
视为 i64
的相同类型,即 Int64
。它来自以下作业测试:
let test1 = i64 ?? 0
print(type(of: test1)) // Int64
let test2 = i64 ?? Int64(0)
print(type(of: test2)) // Int64
let test3 = i64 ?? Int32(0) // compiled error
但是为什么 Array 中的 i64 ?? 0
值与 i64 ?? Int64(0)
不同?
我真的需要在每个赋值操作中指定 0
的类型吗?有什么方法可以使数组在没有 Int64(0)
类型转换的情况下按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。