【问题标题】:Swift: strange behavior about unwrappingSwift:关于展开的奇怪行为
【发布时间】:2014-07-19 20:06:35
【问题描述】:

在我的 Child 模型中,我声明了以下属性:

var name:String?
var year:String?
var make:String?
var model:String?

和初始化:

init(name:String, ... ,year:String, make:String, model:String, ...){
    self.name = name
    ...
    self.year = year
    self.make = make
    self.model = model
}

这里我构造了一个孩子:

Child(name:cName,...,year:cYear,make:cMake, model:cModel,...)

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{ 

对于孩子的名字,我可以直接使用它而无需打开:

cell!.textLabel.text = child.name

但如果我想使用它们,我必须解开 child.year、child.make、child.model。这是为什么呢?

cell!.detailTextLabel.text = child.year! + " " + child.make! + " " + child.model!

我关注了tutorial 并成功构建了项目。在那个项目中,在类似的情况下,我不需要展开。 Code

cell.text = album.title
cell.image = UIImage(named: "Blank52")
cell.detailTextLabel.text = album.price

【问题讨论】:

    标签: swift ios8


    【解决方案1】:

    您需要显式展开,因为您使用的是连接运算符。没有为可选字符串定义连接,因此您需要添加感叹号来解开这些值。如果您使用字符串插值,您应该能够避免它,如下所示:

    cell!.detailTextLabel.text = "\(child.year) \(child.make) \(child.model)"
    

    注意:如果您显示的初始化程序是唯一可用的,您应该能够使您的字符串不可选。

    【讨论】:

    • 谢谢!有道理。这一点是否包含在文档中
    • @fuiiii 我怀疑它现在是否在文档中,但绝对值得包含。
    • 那你是怎么知道的?
    • @fiiii 我读到了连接运算符,发现文档没有提到可选字符串。如果运算符是为可选项定义的,文档会提到这一点,因为为可选项启用连接需要额外的编译器工作。
    • 这个答案最重要的部分是隐藏的lede:你的错误是首先声明name:String?(等)。由于您要在初始化程序中设置这些属性,因此绝对不应该这样做;您应该将它们声明为简单值,例如name:String。这是合法的(不是可选的,但也没有默认值)因为您将在初始化程序中设置它们。然后你所有的问题都会烟消云散!
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多