我有一个内部变量:
internal var categories: Set<MyCategory>? {
if let a = self.a {
return a
} else {
return nil
}
}
但是当我尝试将Array设置为此Set时:
self.categories = Set(myArray)
它会引发错误:
无法分配给属性:“类别”是仅获取属性
我真的不明白为什么会出现此错误!有人可以解释一下那里发生了什么吗?也许我在Swift知识上有空缺
答案 0 :(得分:2)
您的声明是
的缩写internal var categories: Set<MyCategory>? {
get {
if let a = self.a {
return a
} else {
return nil
}
}
}
只读计算属性。
通过这种方式可以进一步缩短语法
internal var categories: Set<MyCategory>? {
return self.a
}
具有getter和setter的计算属性看起来像
internal var categories: Set<MyCategory>? {
get {
return self.a
}
set {
self.a = newValue
}
}
但是从不这样,此语法将调用setter,该setter调用setter,该setter调用setter,该setter调用setter,该setter调用该setter,该setter调用该setter,该setter调用该setter。 ..会呼叫设置器,崩溃
internal var categories: Set<MyCategory>? {
...
set {
categories = newValue
}
}
答案 1 :(得分:0)
编译器显示错误,因为您试图在只读计算属性上设置值。如果要为其他属性设置一些值,则应按以下说明为其创建设置器。
有两种类型的属性:存储和计算属性。
存储的属性
存储的属性是作为常量的一部分存储的常量或变量 特定类或结构的实例。可以存储属性 可以是变量存储的属性(由var关键字引入) 或常量存储的属性(由let关键字引入)。
计算属性
除了存储的属性,类,结构和 枚举可以定义计算属性,而实际上并不能 存储一个值。而是提供了一个getter和一个可选的setter 间接检索和设置其他属性和值。
因此,计算属性不存储值,而是从其他属性(如果需要)中计算值,并提供getter方法来检索计算值,并提供可选的setter方法来将值设置为其他属性。
例如:
var seconds:Double = 0
var minutes: Double {
get {
return (seconds / 60)
}
set {
seconds = (newValue * 60)
}
}
此处属性seconds
是“存储”属性,minutes
是“计算”属性。
提供了访问分钟的getter方法,并定义了不存储值的更新setter,而是在分钟更新时计算seconds
和更新变量seconds
。
如果您要使用只读的计算变量,则只需删除set {}
方法。
只读计算属性
带有吸气剂但没有的计算属性 setter被称为只读计算属性。只读计算 属性始终返回一个值,并且可以通过点访问 语法,但不能设置为其他值。
您可以通过删除get关键字及其括号来简化对只读计算属性的声明:
例如:
var minutes: Double {
return (seconds / 60)
}
这就是您在代码中所做的事情。
internal var categories: Set<MyCategory>? {
if let a = self.a {
return a
} else {
return nil
}
}
要设置值,您需要为计算属性categories
定义设置器。
有关更多详细信息,请参阅Apple doc