gpt4 book ai didi

ios - 为什么默认情况下符合 Swift 协议(protocol)的值被视为值类型?

转载 作者:行者123 更新时间:2023-12-01 19:37:10 25 4
gpt4 key购买 nike

我有一个协议(protocol),它只描述一个接口(interface)。

protocol SampleProtocol {
var message: String? { get set }}

为什么编译器总是将符合标准的值/对象视为值类型?

示例示例,
 // Protocol value usage
import Foundation


protocol SampleProtocol {
var message: String? { get set }
}

final class SampleObject: SampleProtocol {
var message: String?
}


final class Controller {

var sampleValue: SampleProtocol! {
didSet {
print("New value has been set")
}
}
}


let controller = Controller()
controller.sampleValue = AlphaObject() // Correctly prints "New value has been set"
controller.sampleValue.message = "New message" // Prints again "New value has been set", like for value types

最佳答案

您的协议(protocol) SampleProtocol可以被 class 采用或 struct . Swift 使用的是限制性更强的值类型的行为,直到您告诉它该协议(protocol)将仅由 class 使用。引用类型。

添加符合 AnyObject到您的协议(protocol)以获取引用类型行为:

protocol SampleProtocol: AnyObject {
var message: String? { get set }
}

The Swift 5.1 Programming Guide - Class-Only Protocols更多细节。

该指南指出:

Use a class-only protocol when the behavior defined by that protocol’s requirements assumes or requires that a conforming type has reference semantics rather than value semantics.



历史注释:使用 class关键字 :

在 Swift 4.0 之前,这是使用 class 编写的。关键词:
protocol SampleProtocol: class {
var message: String? { get set }
}

这暂时仍然有效,但它目前只是 AnyObject 的类型别名。并且可能会在更高版本的 Swift 中被删除。

关于ios - 为什么默认情况下符合 Swift 协议(protocol)的值被视为值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59810108/

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