gpt4 book ai didi

ios - 协议(protocol) var {get}

转载 作者:搜寻专家 更新时间:2023-10-31 22:14:08 25 4
gpt4 key购买 nike

每当一个协议(protocol)被声明为只有一个 getter 的 var 时,我认为这意味着 var 可以从类内部设置,而不是从外部设置,因为没有“setter”。

Playground 代码

protocol RunningAnimal{
var limbs:Int { get }
var topSpeed:Int{ get }
}

class Cheetah:RunningAnimal {
var limbs = 4
var topSpeed = 120
}

let cheetah = Cheetah()
cheetah.limbs = 100
print("cheetah limbs ->\(cheetah.limbs)") //prints 100

如果您仍然可以更改其值,那么声明 {get} 有什么意义?

最佳答案

RunningAnimal 作出积极 promise :您必须为 limbs 属性和 topSpeed 属性提供 getter。它不做任何“消极 promise ”。它并不是说您不能为这些属性提供 setter 。您可以提供所需的任何其他方法或访问器。

也就是说,这里的协议(protocol)几乎无关紧要。 cheetahCheetah 类型,Cheetahlimbs 上有一个内部可用的二传手。

如果您更改此代码以使用协议(protocol)类型,那么您将被限制为协议(protocol) promise 的内容:

let cheetah: RunningAnimal = Cheetah()
cheetah.limbs = 100 // error: cannot assign to property: 'limbs' is a get-only property

在您的特定示例中,您几乎可以肯定只是将 limbs 设为 let 变量。您可以自由使用 let 来实现 var {get} promise :

class Cheetah: RunningAnimal {
let limbs = 4
let topSpeed = 120
}

let cheetah = Cheetah()
cheetah.limbs = 100 // error: cannot assign to property: 'limbs' is a 'let' constant

在更一般的情况下,如果您希望属性是私有(private)可写的,您可以将 setter 标记为私有(private):

class Cheetah: RunningAnimal {
let limbs = 4
private(set) var topSpeed = 120
}

您甚至可以计算您的属性,并且仍然符合 RunningAnimal:

class Cheetah: RunningAnimal {
var limbs: Int { return 4 }
var topSpeed: Int { return 120 }
}

只要您根据需要提供 getter 和 setter,协议(protocol)并不关心您如何实现属性。 (这不适用于函数,协议(protocol)函数要求必须作为方法实现,不能作为同类型的闭包属性实现。)

关于ios - 协议(protocol) var {get},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35254703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com