1

我想要完成的是 - 我有两个文本字段,如果用户名文本字段或密码字段,我想向print()控制台发送消息。我注意到的第一件事是文本字段是可选的,因为它们当然可以是空的。那么有人可以向我解释以下代码示例背后的一些语法和推理吗?.isEmpty.isEmpty

Q1:为什么我必须在之后打开包装.isEmpty

if(self.username.text?.isEmpty)! {
    print("Something!")
}

Q2:为什么当您包含 or 运算符时此语法不起作用?

if(self.username.text?.isEmpty || self.password.text?.isEmpty)! {
    print("Please provide username and password!")
}

Q3:为什么我不能在 之后直接解包.isEmpty

if(self.username.text?.isEmpty! || self.password.text?.isEmpty!) {
    print("Please provide username and password!")
}
4

2 回答 2

2

Q1:您必须打开包装,因为该text属性可以是nil. 也许是因为它是一个有效值,也许是因为它是 Objective-C 转换的产物,而且它确实是nil_resettable.

使用!是不安全的,因为当您访问文本时,如果未设置,它可能会崩溃。

尝试这样的事情

if self.username.text?.isEmpty == false {
    print("Something!")
}

如果所需的类型是可选的,则 Swift 对可选提升具有隐式的非可选。

起初它是Bool? == Bool,它变成了Bool? == Bool?

Q2 : 为什么当你包含 or 运算符时这个语法不起作用?

let a: Bool? = self.username.text?.isEmpty
let b: Bool? = self.password.text?.isEmpty
let c = a || b // the problem here is that `Bool?` doesn't implement 
               // the operator `||` as it's not clear how this would
               // work with optionals.

你想做:

guard let username = self.username.text,
   let password = self.password.text,
   !username.isEmpty,
   !password.isEmpty {

    print("Please provide username and password!")
    return
}

// code using username as String and password as String (not optionals)

第三季度

你需要修正你的括号。

if (self.username.text?.isEmpty)! || (self.password.text?.isEmpty)! {
    print("Please provide username and password!")
}

请记住不要!在生产代码中使用。这是不安全的。使用来自Q2的变体。

于 2017-01-29T11:24:51.640 回答
0

Q1:为什么我必须在 .isEmpty 之后解包?

if(self.username.text?.isEmpty)! {
    print("Something!")
}

if语句结构迫使您在正文中拥有,true/false以简化:

let condition = false

if condition {...}

当您打开此语句时self.username.text?.isEmpty,您是在告诉编译器“我保证它永远不会nil”,即使它可能是。

Q2:为什么当您包含 or 运算符时此语法不起作用?

or与之前输入/运算符的原因相同,and必须不是nil(展开)。

注意下面的行。如果您尝试评估此语句,您将看到您正在尝试解开一个布尔值,并使用两个可选参数作为参数。

if(self.username.text?.isEmpty || self.password.text?.isEmpty)! {

Q3:为什么我不能在.isEmpty 之后直接解包?

根据您提出的问题,我在这里猜测。

isEmpty不是可选的,它可以是真/假,因此不能展开。

该语句self.username.text?.isEmpty是可选的,它可以true/false/nil并且可以被解包。

我希望它有助于使事情更清楚。阅读有关选项和分析 Apple 的代码示例可能会有所帮助。

于 2017-01-29T04:54:49.697 回答