基本上,我想比较两个元组,其中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 ?, Bool?)'
所以我做了如下的工作来清除上面的错误。
let expectedResult = (LeadSyncStatus.Synced.rawValue ?? nil, true ?? nil, true ?? nil)
但是这次编译器带有警告,如下所示,
nil合并运算符'??'的左侧具有非可选类型“布尔”,因此从不使用右侧
如何使上面的代码可执行而没有编译器错误和警告?
答案 0 :(得分:2)
几分钟后,我发现如下所示的解决方法。
let tuple1 = (1, true, true) as (Int?, Bool?, Bool?)
现在,编译器错误和警告已清除,代码已顺利执行。
所以我想与大家分享。
希望这可能对其他人有所帮助。
谢谢!
答案 1 :(得分:1)
我找到了另一个解决方案,我认为这比struct
更好:使用typealias
typealias tuple1 = (Int?, Bool?, Bool?)
let myOptionalTuple: tuple1 = (1, true, true)
print(myOptionalTuple.0)
答案 2 :(得分:1)
您可以这样操作:
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")
}