我对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”之类的操作的情况下在可选变量上设置属性?
答案 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"
}