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

时间:2018-12-13 12:30:43

标签: ios swift tuples

基本上,我想比较两个元组,其中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合并运算符'??'的左侧具有非可选类型“布尔”,因此从不使用右侧

如何使上面的代码可执行而没有编译器错误和警告?

3 个答案:

答案 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")
}