【问题标题】:"Cannot assign to the result of this expression" - How to set property of optional variable“无法分配给此表达式的结果” - 如何设置可选变量的属性
【发布时间】:2014-06-04 16:39:29
【问题描述】:

我有一个关于 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”之类的操作的情况下为可选变量设置属性?

【问题讨论】:

  • 更新这个 - 现在看起来可以在 Beta 5 中执行我在问题中提出的问题。耶!

标签: properties swift


【解决方案1】:

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

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

或者如果你确定那里有你可以做的对象

variable.parent!.string = "parent"

请注意,如果您没有初始化父级,则会收到错误消息。

【讨论】:

  • 所以每次我想在可选变量上设置一个属性时,我都必须包含一个 if 语句,如果我不知道它会在那里?
  • 是的!这就是您确保操作安全的方式。在测试其他语言的空值时,您会这样做。
  • @AaronWojnowski:您总是可以这样做:self.parent ? self.parent!.string : nil,这与self.parent?.string 相同。当您正确处理 nil 时,他们提供了一个不错的快捷方式,但请记住,最终结果将是可选的。
【解决方案2】:

您不能在不存在的parent 中分配string。如何避免这种情况取决于您。可以肯定的一件事,要么您将确保 parent 已绑定(例如在某些 init() 方法中绑定),要么您必须每次都使用 if variable.parent(即使您不想这样做),或者您必须定义一个类似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"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2013-12-06
    • 2011-04-10
    • 1970-01-01
    • 2010-10-22
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多