检查数组是否包含Swift中的索引值

时间:2017-01-13 09:09:55

标签: ios arrays swift indexing nsarray

我在plist中有一个包含2个整数值的数组。我可以使用此代码

读取第一个值没问题
let mdic = dict["m_indices"] as? [[String:Any]]
var mdicp = mdic?[0]["powers"] as? [Any]
self.init(
     power: mdicp?[0] as? Int ?? 0
)

不幸的是,有些plist没有第二个索引值。所以叫这个

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

返回零。如何检查是否存在索引,以便仅在存在值时获取值?我试图将它包装在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
    }

但到目前为止我的尝试已经让多个控制台错误。

2 个答案:

答案 0 :(得分:0)

试试这个

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

mdicp可能包含" n"具有可选值的元素的数量,因此您必须在打开它之前执行可选绑定以避免崩溃。

例如,如果我初始化容量为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 :(得分:0)

如果你正在处理整数数组并且只担心前两项,你可以这样做:

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

您是否真的想要使用nil合并操作符??来将缺失值评估为0,或者只是将它们作为选项保留,取决于您。

或者你可以这样做:

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