“无法分配此表达式的结果” - 如何设置可选变量的属性

时间:2014-06-04 16:39:30

标签: properties swift

我对Swift和可选属性有疑问。

假设我有以下代码:

import Foundation

class MyClass: NSObject {

    var parent: MyClass?
    var string: String?

    init() {
        super.init()

    }

}

let variable : MyClass = MyClass()
variable.string = "variable"
variable.parent?.string = "parent"

我在以下行中收到错误,说“无法分配此表达式的结果”

variable.parent?.string = "parent"

现在,我可以通过用感叹号替换问号来抑制此错误,据我所知,这使得Swift认为某个对象将在运行时存在,但它会崩溃,因为显然没有对象。

基本上,如何在不执行“if variable.parent”之类的操作的情况下在可选变量上设置属性?

2 个答案:

答案 0 :(得分:2)

要使用可选项,您需要使用可选的链接

let variable : MyClass = MyClass()
variable.string = "variable"
variable.parent = MyClass()
if let a = variable.parent {
   a.string = "parent"
}

或者如果你确定那里有物体可以做

variable.parent!.string = "parent"

请注意,如果您未初始化父级,则会收到错误。

答案 1 :(得分:1)

您无法在不存在的string中分配parent。你将如何避免这种情况取决于你。有一件事是肯定的,要么你要确保parent被绑定(比如用init()方法绑定),要么每次都必须使用if variable.parent(即使你没有'{1}}。我想要)或者你必须定义一个像assignParentString()这样的方法来实现检查父母。

func assignParentString (string: String) {
  if let parent = self.parent {
    parent.string = string
  }
}

例如:

  3> class MyClass {
  4.     var parent : MyClass?
  5.     var name   : String?
  6.     func aps (name:String) {
  7.         if let parent = self.parent {
  8.             parent.name = name
  9.         }   
 10.     }   
 11. }   
 12> var mc = MyClass()
mc: MyClass = {
  parent = nil
  name = nil
}
 13> mc.name = "mc"
 14> mc.aps ("mcp")           // no error, name did not take
 15> mc
$R3: MyClass = {
  parent = nil
  name = "mc"
}
 16> mc.parent = MyClass()
 17> mc.aps ("mcp")
 18> mc
$R6: MyClass = {
  parent = Some {
    parent = nil
    name = "mcp"
  }
  name = "mc"
}