【问题标题】:Create a constant tuple with Non-optional values and compare with another tuple which has optional values创建一个具有非可选值的常量元组,并与另一个具有可选值的元组进行比较
【发布时间】:2018-12-13 12:30:43
【问题描述】:

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

如何使上述代码在没有编译器错误和警告的情况下可执行?

【问题讨论】:

    标签: ios swift tuples


    【解决方案1】:

    几分钟后,我找到了一个解决方法,如下所示。

    let tuple1 = (1, true, true) as (Int?, Bool?, Bool?)

    现在编译器错误和警告已清除,代码执行顺利。

    所以想跟大家分享一下。

    希望这可能对其他人有所帮助。

    谢谢!

    【讨论】:

    • 这是有效的解决方案还是有其他有效的方法?
    • 您的用例是什么?为什么需要这样的行为?
    • @FruitAddict,实际上我正在编写单元测试用例,我需要它。示例:XCTAssert(tuple1 == tuple2, "test case failed, actualResult:\(tuple2)")
    • 另一种方法:let tuple1: (Int?, Bool?, Bool?) = (1, true, true)
    • 另一种方式:let tuple1 = (Optional(1), Optional(true), Optional(true))
    【解决方案2】:

    我找到了另一个解决方案,我认为这比struct 更好用:使用typealias

    typealias tuple1 = (Int?, Bool?, Bool?)
    
    let myOptionalTuple: tuple1 = (1, true, true)
    
    print(myOptionalTuple.0) 
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多