首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3 NSArray与零的比较

Swift 3 NSArray与零的比较
EN

Stack Overflow用户
提问于 2017-03-15 23:48:07
回答 3查看 981关注 0票数 1

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

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

代码语言:javascript
复制
let variable = something as? NSArray
  if variable == nil {
    // do something
  }

它不允许我将此变量与nil进行比较,从而导致错误“比较此变量,总是返回false”。我试过将variable.description与“”进行比较,但它做的是同样的事情吗?我说的“某件事”是指:

代码语言:javascript
复制
var variable = dict.object(forKey: someString) as! NSArray

我想要做的主要事情是:

代码语言:javascript
复制
var variable = dict.object(forKey: someString) as! NSArray
  if variable == nil {
    //create 
  }
  else {
    // append
  }
EN

回答 3

Stack Overflow用户

发布于 2017-03-15 23:52:11

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

代码语言:javascript
复制
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本机数组类型。这可以像这样声明:

代码语言:javascript
复制
let someArray = ["string1", "string2"]
票数 3
EN

Stack Overflow用户

发布于 2017-03-16 16:34:35

这一行表明变量必须为 an NSArray。如果dict.object(forKey: someString)不是NSArray,这将导致崩溃

代码语言:javascript
复制
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

但是,您随后可以使用

代码语言:javascript
复制
if variable == nil {

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

你可能想要的是:

代码语言:javascript
复制
if let variable = dict.object(forKey:someString) as? NSArray    

如果满足以下条件,则返回false:

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

在此之后,variable现在是一个non-optional NSArray。它保证是一个NSArray,并且保证不是nil。您可以使用它,而不需要打开它。例如:

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2017-03-16 00:58:57

您也可以在guard-else中使用此格式

代码语言:javascript
复制
guard let variable = something as? NSArray else {
    // your variable is nil. Do something if needed
}
// your variable is available in this scope. Do something when variable contains Array
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42814598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档