创建一个具有非可选值的常量元组,并与另一个具有可选值的元组进行比较



基本上,我想比较两个元组,其中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")
}

最新更新