2017-01-13 78 views
1

我有一個plist中包含2個整數值的數組。我可以讀取第一個值使用此代碼沒有問題檢查數組是否包含索引值Swift

let mdic = dict["m_indices"] as? [[String:Any]] 
var mdicp = mdic?[0]["powers"] as? [Any] 
self.init(
    power: mdicp?[0] as? Int ?? 0 
) 

不幸的是,一些plists沒有第二個索引值。所以打電話給這個

power: mdicp?[1] as? Int ?? 0 

return nil。我如何檢查是否有索引,因此只有當值存在時才抓取值?我試圖把它包裝在一個if-let聲明中

 if let mdicp1 = mdic?[0]["powers"] as? [Any]?, !(mdicp1?.isEmpty)! { 
     if let mdicp2 = mdicp1?[1] as! Int?, !mdicp2.isEmpty { 
      mdicp2 = 1 
     } 
    } else { 
     mdicp2 = 0 
    } 

但我迄今爲止的嘗試都讓多個控制檯錯誤。

回答

0

如果你處理的整數數組,並且只擔心前兩個項目,你可以這樣做:

let items: [Int] = [42, 27] 
let firstItem = items.first ?? 0 
let secondItem = items.dropFirst().first ?? 0 

無論您是否真的想要使用零合併運算符??來將缺失值評估爲0或僅將它們作爲可選項,取決於您。

或者你可以這樣做:

let firstItem = array.count > 0 ? array[0] : 0 
let secondItem = array.count > 1 ? array[1] : 0 
0

試試這個

if mdicp.count > 1, 
    let mdicpAtIndex1 = mdicp[1] { 
    /// your code 
} 

mdicp可能包含可選值元素的數量「N」,那麼你要做的可選結合之前拆開包裝,以避免崩潰。

例如,如果我intialize陣列容量5

var arr = [String?](repeating: nil, count: 5) 

print(arr.count) /// it will print 5 
if arr.count > 2 { 
     print("yes") /// it will print 
} 

if arr.count > 2, 
    let test = arr[2] { // it won't go inside 
    print(test) 
} 

///if I unwrap it 
print(arr[2]!) /// it will crash 
+1

如果'mdicp'只有一個項目,這將崩潰。數組不是像字典,如果沒有找到鍵,它將返回'nil'。對於數組,如果索引超出邊界,則會崩潰。 – Rob

相關問題