Swift2 对swift中的可选类型感到困惑(“Nil可以与Int相比”)
我忘了在Interface Builder中将tableView连接到ViewController, 所以变量tableView现在是nil 我对可选类型感到困惑。看看下面的代码Swift2 对swift中的可选类型感到困惑(“Nil可以与Int相比”),swift2,Swift2,我忘了在Interface Builder中将tableView连接到ViewController, 所以变量tableView现在是nil 我对可选类型感到困惑。看看下面的代码 class ViewController: NSViewController { @IBOutlet weak var tableView: NSTableView? override func viewDidLoad() { super.viewDidLoad()
class ViewController: NSViewController {
@IBOutlet weak var tableView: NSTableView?
override func viewDidLoad() {
super.viewDidLoad()
if self.tableView?.selectedRow != 0 {
print("do something")
}
}
}
当我的实例的可选变量tableView
为nil时,为什么我的if
语句为true
在Swift中“nil可以与Int进行比较”有意义吗?因为
nil != 0 // true !!!
这永远是真的
if self.tableView?.selectedRow != nil {
print("do something")
}
可能是,你想要什么。或者更好
if let selectedRow = self.tableView?.selectedRow {
print(selectedRow)
}
因为它不够表达,我添加了苹果文档的引文
“Swift的零与Objective-C中的零不同。在Objective-C中,
nil是指向不存在对象的指针。在Swift中,nil不是
指针它是指缺少某种类型的值
任何类型都可以设置为nil,而不仅仅是对象类型。”
摘自:苹果公司《Swift编程语言(Swift 2.2)》,iBooks
“那么,将nil与Int进行比较有意义吗?”
为什么编译器不抱怨比较nil和非可选值
let i: Int? = 2
i == 2 // true
i == 0 // false
i == nil // false
let s: String? = "str"
s == "str" // true
s == nil // false
let j: Int! = nil
j == nil // true
let k: Int? = nil
k == nil // true
以上所有内容必须是有效使用Swift期权概念的有效声明,因为
nil != 0 // true !!!
这永远是真的
if self.tableView?.selectedRow != nil {
print("do something")
}
可能是,你想要什么。或者更好
if let selectedRow = self.tableView?.selectedRow {
print(selectedRow)
}
因为它不够表达,我添加了苹果文档的引文
“Swift的零与Objective-C中的零不同。在Objective-C中,
nil是指向不存在对象的指针。在Swift中,nil不是
指针它是指缺少某种类型的值
任何类型都可以设置为nil,而不仅仅是对象类型。”
摘自:苹果公司《Swift编程语言(Swift 2.2)》,iBooks
“那么,将nil与Int进行比较有意义吗?”
为什么编译器不抱怨比较nil和非可选值
let i: Int? = 2
i == 2 // true
i == 0 // false
i == nil // false
let s: String? = "str"
s == "str" // true
s == nil // false
let j: Int! = nil
j == nil // true
let k: Int? = nil
k == nil // true
以上所有内容必须是有效使用Swift期权概念的有效声明(编辑更新:在OP添加附加问题后)
我会为你的问题补充一个答案
“在Swift中,nil可以与Int进行比较,这有意义吗?”
可以考虑<代码>可选一种类型,就像<代码> int <代码>或双,<代码>双< /> >,使用(简化)枚举实现< /p>
enum Optional<T> {
case None
case Some(T)
init(_ value: T) {
self = .Some(value)
}
init() {
self = .None
}
}
让a
成为MyTopStruct
的一个实例,并在我们的示例中具有一些整数和可选整数属性:
var a = MyTopStruct()
let myInt = 10
var myOptionalInt : Int? = nil
然后,如果a.b?.c!=d{…子句,取决于此示例中的选项是否为nil
(初始化时)
(编辑更新:OP添加附加问题后)
我会为你的问题补充一个答案
“在Swift中,nil可以与Int进行比较,这有意义吗?”
可以考虑<代码>可选一种类型,就像<代码> int <代码>或双,<代码>双< /> >,使用(简化)枚举实现< /p>
enum Optional<T> {
case None
case Some(T)
init(_ value: T) {
self = .Some(value)
}
init() {
self = .None
}
}
让a
成为MyTopStruct
的一个实例,并在我们的示例中具有一些整数和可选整数属性:
var a = MyTopStruct()
let myInt = 10
var myOptionalInt : Int? = nil
然后,如果a.b?.c!=d{…子句,我们有一些不同的结果,这取决于本例中的选项是否为nil
(初始化时)
0是某物,它什么都不是,但它是某物。nil和null(在大多数语言中)是一个什么也不是什么东西。@Psychrom我们说的是Swift吗?在这种情况下,nil!=0,很简单,不是吗?顺便问一下,有多少语言使用nil、null和0作为等价值?你的意思是它们是不同的类型。说nil!=0
不是很有表现力。我所知道的唯一可以在哪里使用它们的语言是我是C和C++的。@ TROJANFOI我从苹果文档中添加了一些引用…我希望它能帮助人们从C语言中快速进入。在SWIFT 0中,“NIL可以和int比较”是否有意义,它是一个东西,它什么都不是,但是它是什么。是一个什么也不是什么东西。@Psychrom我们说的是Swift吗?在这种情况下,nil!=0,很简单,不是吗?顺便问一下,有多少语言使用nil、null和0作为等价值?你的意思是它们是不同的类型。说nil!=0
不是很有表现力。我所知道的唯一可以在哪里使用它们的语言是我是C和C++的。@ TROJANFOE我从苹果文档中添加了一些引文……我希望它能帮助人们从C语言中快速进入。在SWIFT中,“NIL可以和int比较”是否有意义?我的答案包括并回答你的附加问题(你刚编辑过)。。编辑了我的答案,包括并回答了您的附加问题(您刚刚编辑的问题)。