Xcode中奇怪的仅获取问题

时间:2018-09-05 10:50:36

标签: ios swift xcode

我有一个内部变量:

internal var categories: Set<MyCategory>? {
    if let a = self.a {
        return a
    } else {
        return nil
    }
}

但是当我尝试将Array设置为此Set时:

self.categories = Set(myArray)

它会引发错误:

  

无法分配给属性:“类别”是仅获取属性

我真的不明白为什么会出现此错误!有人可以解释一下那里发生了什么吗?也许我在Swift知识上有空缺

2 个答案:

答案 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