![](/img/trans.png)
[英]Best approach to create Non-optional Codable with `default values` in swift
[英]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.