swift - 为什么 type 属性在 copyOnWrite 期间没有得到更新
问题描述
struct Card: CustomStringConvertible {
var identity:Int
var description: String {
return "card:\(identity)"
}
static var numberOfCards = 0
init(identity:Int) {
Card.numberOfCards += 1
self.identity = identity
}
}
var cards = [Card]()
let cardOne = Card(identity: 1)
var cardTwo = cardOne //card:1
Card.numberOfCards // 1
cardTwo.identity = 2 // card:2
Card.numberOfCards // 1
使用写时复制不会创建新对象,直到我们改变复制的对象。为什么numberOfCard
我更改了cardTwo
属性的值后 的值保持不变?
解决方案
是的!实际上我的问题似乎是扭曲和毫无意义的,对不起:(我在特定情况下感到困惑(这不是那种情况:))你必须为你自己的数据类型实现写时复制功能,例如当一个结构包含可变引用,但仍应保留值语义
也许下面的代码可以解释我想要做什么(即使毫无意义:))谢谢你的回答;)
class Identifier {
static var instanceNumbers = 0
var identity:Int
init(identity:Int) {
Identifier.instanceNumbers += 1
self.identity = identity
}
}
struct Card: CustomStringConvertible {
private var _id:Identifier
var id:Identifier {
mutating get {
if !isKnownUniquelyReferenced(&_id){
let identity = _id.identity
_id = Identifier(identity: identity)
}
return _id
}
}
init(id:Identifier){
self._id = id
}
var description: String {
return "card:\(_id.identity)"
}
}
let cardOne = Card(id: Identifier(identity: 1))
let cardTwo = Card(id: Identifier(identity: 2))
Identifier.instanceNumbers // 2
var cardThree = cardTwo
Identifier.instanceNumbers // 2
cardThree.id.identity = 3
Identifier.instanceNumbers // 3
推荐阅读
- php - 如何链接到页面的特定部分 HTML PHP
- c# - 当后端代码中的简单键值变量工作相同时,为什么要使用 redis 作为缓存层?
- google-apps-script - Google Slides Apps 脚本检索页面中的形状
- python-3.x - 在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
- java - JavaFX - 在使用选项卡时将 GUI 拆分为单独的类
- jquery - 通过函数调整电子窗口大小
- scheme - 匹配方案中的括号
- android - 当我使用 adb 显示 /sys/kernel/debug/tracing/available_filter_functions 时没有这样的设备
- python - 初始化以迭代抽象pyomo模型中的集合?
- angular-cli - 运行 ng serve -o 时出现错误