Swift中类为何可使用{ get }声明属性?它不应仅用于协议吗?
Swift类中
{ get }属性声明的常见误区 协议与类中{ get }的本质区别
在Swift协议里,{ get }是用来定义属性访问权限要求,比如:
protocol Identifiable { var id: String { get } }
它只要求遵循协议的类型提供一个可读的id属性,具体实现可以是存储属性、只读计算属性,甚至类中的可读写存储属性(因为可读写天然包含可读能力)。
但在类的属性声明中,直接写{ get }属于语法错误——类里的属性需要明确的实现逻辑,而非仅声明权限:
- 存储属性直接声明类型和默认值(用
let实现只读,var实现读写) - 计算属性必须写出
get代码块的具体逻辑,或者省略get关键字直接返回值(只读计算属性默认隐含get)
你报错的核心原因
当你在类里写var someProperty: Int { get }这类代码时,编译器会报错,因为这不符合类属性的语法规则。协议里的{ get }是“约定”,而类里需要的是“具体实现”,不能只写get而不提供逻辑。
类中实现只读属性的正确方式
如果要在类里创建只读属性,有两种标准写法:
- 存储型只读属性:用
let声明,初始化后不可修改
class Product { let productId: Int init(id: Int) { productId = id } }
- 计算型只读属性:实现
get逻辑(或省略get直接返回值)
class Product { let productId: Int // 省略get关键字的简洁写法 var productDescription: String { return "Product ID: \(productId)" } // 显式写get的写法(效果一致) var anotherDesc: String { get { return "ID: \(productId)" } } }
内容的提问来源于stack exchange,提问作者dyouknow
相关产品推荐
相关产品推荐

