gpt4 book ai didi

Swift 计算属性返回底层数组的副本

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

我有一个用 Objective-C 编写的模型类,我正在将其转换为 Swift。它包含一个 NSMutableArray在内部,但是 getter 的方法签名以及实际返回值是 NSArray .调用时,它会创建一个不可变副本以返回。

本质上,我希望调用者能够迭代/检查容器,但不能修改它。我有这个测试片段:

class Container {
internal var myItems = [String]()

func sayHello() {
"I have: \(myItems)"
}
}

let cont = Container()

cont.myItems.append("Neat") // ["Neat"]

cont.sayHello() // This causes sayHello() to print: "I have: [Neat]"

var isThisACopy = cont.myItems

isThisACopy.append("Huh") // ["Neat", "Huh"]

cont.sayHello() // This ALSO causes sayHello() to print: "I have: [Neat]"

我一直在努力寻找一种方法来覆盖 myItems 的 getter以便它返回一个不可变的副本,但似乎无法确定如何返回。

尝试 #1

这会产生一个编译器错误:Function produces expected type '_ArrayBuffer<(String)>'; did you mean to call it with '()'?

internal var myItems = [String]() {
var copy = [String]()
for item in ... { // What to use in the ...?
copy.append(item)
}
return copy
}

尝试 #2

这也会产生编译器错误,因为我(可以理解)重新定义生成的 getter Invalid redeclaration of 'myItems()' :

internal func myItems() -> [String] {
var copy = [String]()
for item in myItems {
copy.append(item)
}
return copy
}

最佳答案

试试这个:

class Container {
private var _myItems: [String] = ["hello"]
internal var myItems: [String] {
return _myItems
}
}

let cont = Container()
cont.myItems.append("Neat") //not allowed

它使用私有(private)存储属性和返回不可变副本的计算属性。存储属性不可能使用自定义 getter。

关于Swift 计算属性返回底层数组的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25798579/

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