Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Properties &引用;无法分配到此表达式的结果";-如何设置可选变量的属性_Properties_Swift - Fatal编程技术网

Properties &引用;无法分配到此表达式的结果";-如何设置可选变量的属性

Properties &引用;无法分配到此表达式的结果";-如何设置可选变量的属性,properties,swift,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

我有一个关于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"
我在下面的一行中得到一个错误,说“无法分配给此表达式的结果”

现在,我可以通过用感叹号替换问号来抑制这个错误,据我所知,这个感叹号使Swift假设一个对象在运行时会在那里,但它崩溃了,因为显然没有对象


从本质上讲,如果不执行“if variable.parent”之类的操作,如何在可选变量上设置属性?

要使用可选变量,需要使用可选链接

let variable : MyClass = MyClass()
variable.string = "variable"
variable.parent = MyClass()
if let a = variable.parent {
   a.string = "parent"
}
或者,如果您确定有对象,您可以这样做

variable.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"
}

所以,每当我想在可选变量上设置属性时,如果我不知道它会在那里,我就必须包含一个if语句?是的!这就是确保操作安全的方法。在其他语言中测试空值时,您可以这样做。@AaronWojnowski:您可以一直这样做:
self.parent?自我,家长!。字符串:nil
,与
self.parent?.string
相同。当你正确处理
nil
时,他们为你提供了一个很好的快捷方式,但请记住,最终结果将是可选的。在Beta 5中更新这个-现在看起来可以按照我在问题中的要求进行。耶!
  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"
}