代码之家  ›  专栏  ›  技术社区  ›  J. Doe

奇怪的是,Xcode中只有一个问题

  •  -1
  • J. Doe  · 技术社区  · 8 年前

    我有一个内部变量:

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

    但当我尝试将数组设置为:

    self.categories = Set(myArray)
    

    这就产生了一个错误:

    我真的不明白为什么会出现这个错误!有人能解释一下那里发生了什么吗?也许我的知识里有些空白

    2 回复  |  直到 8 年前
        1
  •  2
  •   vadian    8 年前

    你的声明是

    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
        }
    }
    
        2
  •  0
  •   Sunil Sharma Tapas Palui    8 年前

    编译器显示错误,因为您试图设置只读计算属性的值。如果要将某些值设置为其他属性,应该为其创建setter,如下所述。

    在swift中,有两种类型的属性: 存储和计算

    储存财产

    存储属性是作为 可以是变量存储属性(由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的方法,该方法不存储它计算的值 秒 和更新变量 秒 当会议记录更新时。

    如果您想要一个只读的计算变量,那么只需删除 set {} 方法。

    只读计算属性

    有getter但没有getter的计算属性 setter被称为只读计算属性。只读计算机 属性总是返回一个值,并且可以通过点访问 语法,但不能设置为其他值。

    例如:

    var minutes: Double {
        return (seconds / 60)
    }
    

    这就是您在代码中所做的。

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

    categories .

    更多详情请参考 Apple doc