簡體   English   中英

用非可選值創建一個常量元組,然后與另一個具有可選值的元組進行比較

[英]Create a constant tuple with Non-optional values and compare with another tuple which has optional values

基本上,我想比較兩個元組,其中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合並運算符'??'的左側 具有非可選類型“布爾”,因此從不使用右側

如何使上面的代碼可執行而沒有編譯器錯誤和警告?

幾分鍾后,我發現如下所示的解決方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM