在 Swift 中定义一个只读属性

Posted

技术标签:

【中文标题】在 Swift 中定义一个只读属性【英文标题】:Define a read-only property in Swift 【发布时间】:2016-07-12 00:17:08 【问题描述】:

如何在 Swift 中定义只读属性?我有一个父类需要定义一个公共属性,例如。 itemCount。这是我的代码:

Class Parent: UIView 
  private(set) var itemCount: Int = 0


class Child 
  private(set) override var itemCount 
    get 
      return items.count
    
  

我收到错误:Cannot override mutable property with read-only property


选项 1 - 协议:

我不能使用协议,因为它们不能从类继承 (UIView)

选项 2 - 组成:

我将 var view = UIView 添加到我的 Child 类中,并从我的 Parent 类中删除 UIView 继承。这似乎是唯一可能的方法,但在我的实际项目中,这似乎是错误的做法,例如。 addSubview(myCustomView.view)

选项 3 - Child 类的子类 UIView

我也不能这样做,因为我打算拥有多个具有不同属性和行为的相关 Child 类,并且我需要能够将我的 Child 类的实例声明为要采用的 ParentUIView 的属性和Parent 的公共属性的优势。

【问题讨论】:

【参考方案1】:

您可以使用Computed Property,它(像方法一样)可以被覆盖。

class Parent: UIView 
    var itemCount: Int  return 0 


class Child: Parent 
    override var itemCount: Int  return 1 

更新(作为对下面评论的回复)

这就是你声明和覆盖函数的方式

class Parent: UIView 
    func doSomething()  print("Hello") 


class Child: Parent 
    override func doSomething()  print("Hello world!") 

【讨论】:

谢谢!我是否也必须使用varoverride var 来声明函数? 不,declare a function 你使用func 关键字。 我无法在Parent 中定义它,并且无法在Child 类中成功覆盖它【参考方案2】:

您可以将 setter 声明为私有,而 getter 是公开的。

public class someClass 
    public private(set) var count: String

参考这个link

【讨论】:

链接已失效。 :(【参考方案3】:

作为另一种选择,您可以将私有变量用于读/写,另一个用于只读。计数用于内部类更改,numberOfItems 用于公共访问。有点奇怪,但它解决了问题。

class someClass 
    private var count: Int = 0
    var numberOfItems: Int  return count 

    func doSomething()  
       count += 1
    

【讨论】:

以上是关于在 Swift 中定义一个只读属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中覆盖 Objective-C 的只读属性?

Swift 中的惰性只读属性

关于swift中的只读属性

在 JavaScript 中定义只读属性

在 JavaScript 中定义只读属性

Python面向对象编程第19篇 只读属性