无法转换值类型"字符串?" 预期参数类型"inout string"

8 string swift swift2 swift3

这行self.displayResultLable.text += (title as! String)错误抛出

无法转换值类型"字符串?" 预期参数类型"inout string"

这是我的代码:

   if results.count > 0 {
                    var displayResult : String?
                    for books in results as! [NSManagedObject] {

                        if let title = books.valueForKey("title") {

                            self.displayResultLable.text +=  (title as! String)

                        }
                    }
                }
Run Code Online (Sandbox Code Playgroud)

inout这里的字符串是什么?什么是最佳做法?

注意这一行 self.displayResultLable.text = (title as! String)工作正常:

Ras*_*n L 21

你需要这样写它:

self.displayResultLable.text =  self.displayResultLable.text! + title as! String
Run Code Online (Sandbox Code Playgroud)

这是因为左侧是可选的而右侧不是,它们不匹配.这就是为什么你需要写label.text = label.text + ...

我也建议你改为if let改为:

if let title = books.valueForKey("title") as? String {
   self.displayResultLable.text = (self.displayResultLable.text ?? "") + title
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,请注意,对于选项,没有"+ ="的重载(即,即使lhs和rhs都是相同包装类型的选项,也没有`+ =`运算符).原因很明显; 给定两个选项(相同的包装类型),比如说`lhs`和`rhs`,如果`lhs`或`rhs`是`nil`,那么`lhs + = rhs`的结果值是什么? ? (7认同)
  • 如果`self.displayResultLable.text`尚未赋值(即,值为'nil`),该怎么办?然后在`... = self.displayResultLable.text中显式展开它!...`将产生运行时异常.永远不应该鼓励使用显式("强制")展开**,除非已经断言解包的对象是非"无".更安全的方法是例如使用`nil`合并运算符来设置文本的defailt"当前状态",以防它的`String`属性为`nil`.例如`self.displayResultLable.text =(self.displayResultLable.text ??"")+ title (3认同)