Swift 3 NSArray与零相比

Swift 3 NSArray与零相比,swift,xcode,variables,Swift,Xcode,Variables,我正在尝试将一个objc项目迁移到swift3。我不确定如何将数组与nil进行比较。我找到了这个主题,但那是两年前的事了,swift的语法已经改变了很多 如果我在swift中有这样的代码: let variable = something as? NSArray if variable == nil { // do something } 它不允许我将此变量与nil进行比较,从而导致错误“比较此变量时,始终返回false”。我尝试过将variable.description与“

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

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

let variable = something as? NSArray
  if variable == nil {
    // do something
  }
它不允许我将此变量与nil进行比较,从而导致错误“比较此变量时,始终返回false”。我尝试过将variable.description与“”进行比较,但它是否也有相同的作用? 我所说的“某物”是指:

我想做的主要事情是:

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

这就是可选的展开语法的用途。可以将展开和强制转换合并到一个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"]

这就是可选的展开语法的用途。可以将展开和强制转换合并到一个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"]
使用此声明,
变量
将是可选类型(
NSArray?
),并且永远不会为零。这是因为将
转换为?
会返回一个可选值,该值要么包含已成功转换的对象,要么不包含任何内容。您可以通过alt单击Xcode中的变量名来查看这一点

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

if let variable = variable {
    // variable is guaranteed to be an NSArray here.
}
使用此声明,
变量
将是可选类型(
NSArray?
),并且永远不会为零。这是因为将
转换为?
会返回一个可选值,该值要么包含已成功转换的对象,要么不包含任何内容。您可以通过alt单击Xcode中的变量名来查看这一点

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

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

您也可以将此格式与
guard else
一起使用:

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

您也可以将此格式与
guard else
一起使用:

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

该行表示变量,且必须为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 {
这就是警告的来源。变量不能为零,因为变量不是可选的


您可能想要的是:

if let variable = dict.object(forKey:someString) as? NSArray    
如果出现以下情况,则返回false:

  • dict.object(forKey:someString)
    返回一个nil对象
  • 返回的对象不是NSArray
在此之后,
变量
现在是一个非可选的NSArray。它保证是一个NSArray,并且保证不为
nil
。您可以使用它而无需展开它。e、 g


该行表示变量,且必须为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 {
这就是警告的来源。变量不能为零,因为变量不是可选的


您可能想要的是:

if let variable = dict.object(forKey:someString) as? NSArray    
如果出现以下情况,则返回false:

  • dict.object(forKey:someString)
    返回一个nil对象
  • 返回的对象不是NSArray
在此之后,
变量
现在是一个非可选的NSArray。它保证是一个NSArray,并且保证不为
nil
。您可以使用它而无需展开它。e、 g



请您也向我们展示一下您是如何定义
某物的
好吗?Swift中基本上不使用
NSArray
的可能重复项。您正在丢弃类型信息。使用always Swift
Array
。如果稍后阻塞,您可能希望能够在该
之外使用变量
,对吗?@Vadian因此它意味着应该始终使用数组、字符串、日期等,而不是NSArray、NSString、,NSDate?您能否向我们展示一下您是如何定义
某物的
请?基本上不在Swift中使用
NSArray
的可能重复项。您正在丢弃类型信息。使用always Swift
Array
。如果稍后阻塞,您可能希望能够在该
之外使用变量
,对吗?@Vadian因此它意味着应该始终使用数组、字符串、日期等,而不是NSArray、NSString、,NSDate?是不是
nil
编译器翻译成
可选的文本值。none
?好了,您可以随时将可选值与
nil
进行比较。
nil
不是编译器转换为
可选值的文本值吗?无
?好的,你可以随时将可选项与
nil
进行比较。我不记得了,现在无法检查它。但如果我是对的话,那是和object forkey有关的。明天我会试试这个。还有一件事,如果“variable”为零,我可以键入else语句来回答您的问题。我说的“something”是指->var variable=dict.object(forKey:someString)as!恩萨雷。它改变了什么,或者我仍然可以用你的例子吗?我不记得了,现在无法检查。但如果我是对的话,那是和object forkey有关的。明天我会试试这个。还有一件事,如果“variable”为零,我可以键入else语句来回答您的问题。我说的“something”是指->var variable=dict.object(forKey:someString)as!恩萨雷。它改变了什么,或者我仍然可以用你的例子吗?但首先,我需要它是一个零。因为它第一次创建列表时,所有其他时间都只是附加数组。然后只需要一个else子句。看看我的最新答案。但首先,我需要它是零。因为它第一次创建列表时,所有其他时间都只是附加数组。然后