基本上,我想比较两个元组,其中tuple1
有3个值,所有值都是非可选的,而tuple2
有3个数据类型相同但都是可选的变量。
let tuple1 = (1, true, true) // Static tuple
let tuple2 = (value1?.intValue, value2?.boolValue, value3?.boolValue) //Here value1,2.. are optional `NSNumber` values.
当我尝试比较它们tuple1 == tuple2
时,我得到了如下所示的编译器错误
无法将元组转换"(Int,Bool,Bool("表示为"(Int?,Bool?,Boo?(">
所以我做了一个像下面这样的解决方案来清除上面的错误。
let expectedResult = (LeadSyncStatus.Synced.rawValue ?? nil, true ?? nil, true ?? nil)
但这一次编译器附带了警告,如下所示,
零合并运算符"??"的左侧具有非可选类型"Bool",因此右侧从未使用
如何在没有编译器错误和警告的情况下使上述代码可执行?
几分钟后,我发现了如下的解决方案。
let tuple1 = (1, true, true) as (Int?, Bool?, Bool?)
现在编译器错误和警告被清除,代码被顺利执行。
所以我想和大家分享一下。
希望这能帮助到其他人。
谢谢!
我找到了另一个解决方案,我认为这比struct
更好:使用typealias
typealias tuple1 = (Int?, Bool?, Bool?)
let myOptionalTuple: tuple1 = (1, true, true)
print(myOptionalTuple.0)
你可以这样做:
let tuple1 = (1, true, true)
let tuple2: (Int?, Bool?, Bool?) = (1, true, true)
let (a, b, c) = tuple2
if let aValue = a,
let bValue = b,
let cValue = c,
(aValue, bValue, cValue) == tuple1 {
print("Equal")
}
或者按照vacawama的建议
let tuple1 = (1, true, true)
let tuple2: (Int?, Bool?, Bool?) = (1, true, true)
if case let (a?, b?, c?) = tuple2,
(a, b, c) == tuple1 {
print("Equal")
}