Swift2 对swift中的可选类型感到困惑(“Nil可以与Int相比”)

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()

我忘了在Interface Builder中将tableView连接到ViewController, 所以变量tableView现在是nil

我对可选类型感到困惑。看看下面的代码

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比较”是否有意义?我的答案包括并回答你的附加问题(你刚编辑过)。。编辑了我的答案,包括并回答了您的附加问题(您刚刚编辑的问题)。