Swift 3 NSArray与零相比

时间:2017-03-15 15:48:07

标签: swift xcode variables

我正在尝试将objc项目迁移到swift3。我不确定如何将数组与nil进行比较。我找到了this主题,但那是2年前,swift的语法发生了很大的变化。

如果我在swift中有这样的代码:

let variable = something as? NSArray
  if variable == nil {
    // do something
  }

它不会让我将此变量与nil进行比较,从而导致错误“比较此变量,始终返回false”。我试过将variable.description与“”进行比较,但它是否做同样的事情? 通过“某事”我的意思是:

var variable = dict.object(forKey: someString) as! NSArray

我想要做的主要是:

var variable = dict.object(forKey: someString) as! NSArray
  if variable == nil {
    //create 
  }
  else {
    // append
  }

4 个答案:

答案 0 :(得分:3)

这就是可选的解包语法。您可以将展开和强制转换合并到一个if语句中:

if let variable = something as? NSArray {
    // variable is not nil and is an NSArray
    // Now you can do something with it.
} else {
    // Either something is nil or it is not able to be cast as an NSArray
    // Handle this case.
}

我还应该提一下,如果你不需要在Objective-C中使用something,那么你应该使用Swift本机数组类型。这可以这样声明:

let someArray = ["string1", "string2"]

答案 1 :(得分:1)

此行表示变量 必须为NSArray。如果dict.object(forKey: someString)不是NSArray,则会导致崩溃

var variable = dict.object(forKey: someString) as! NSArray
//                                               ^
// This exclamation mark means you are certain this is an NSArray
// Also, because there is no question mark after NSArray, this variable
// is not optional. It cannot be nil

但是,然后使用

if variable == nil {

这就是警告的来源。变量永远不能为零,因为变量不是 optional

你可能想要的是:

if let variable = dict.object(forKey:someString) as? NSArray    

如果出现以下情况,则返回false:

  • dict.object(forKey:someString)返回一个nil对象
  • 返回的对象不是NSArray

此后variable现在是非可选 NSArray。它保证是一个NSArray,并保证不是nil。您可以在不使用展开的情况下使用它。 e.g。

if let variable = dict.object(forKey:someString) as? NSArray {
    for element in variable {
    }
}
else {
    //The dict doesn't contain the object yet. `variable` is nil
    //Create a new array and add it to dict
    let newArray = ["First Value"]
    dict[someString] = newArray
}

答案 2 :(得分:0)

let variable = something as? NSArray

通过此声明,variable将是一个可选类型(NSArray?),永远不会为零。这是因为使用as?进行转换会返回一个可选值,该值包含成功转换的对象或不包含任何内容。你可以通过 alt - 在Xcode中点击变量名来看到这一点。

如果您想知道它是否包含值,您需要使用if let语法:

if let variable = variable {
    // variable is guaranteed to be an NSArray here.
}

答案 3 :(得分:0)

您也可以将此格式与<div class="adxHeader"> <h3 itemprop="name"> » درج داخلي للاجار جديد حي المونسيه</h3> <div class="adxExtraInfo"> <div class="adxExtraInfoPart"><a href="/city/الرياض"><i class="fa fa-map-marker"></i> الرياض</a></div> <div class="adxExtraInfoPart"><a href="/users/ابو نوره"><i class="fa fa-user"></i> ابو نوره</a></div> </div> <div class="adxExtraInfo"> <div class="adxExtraInfoPart"> قبل ساعه و 27 دقيقه</div> <div class="adxExtraInfoPart">#20467014</div> </div> <div class="moveLeft"> <a href="www.google.com" class="nextad"> &#8592; التالي </a> <br /> </div> </div>

一起使用
guard-else