【发布时间】:2021-05-10 16:30:36
【问题描述】:
我正在尝试在 Swift 中继承 NSMutableArray 以将 Swift 数组的桥接功能提供给一些旧的 Objective-C 代码库。但是,我找不到功能示例,到目前为止我的所有尝试都失败了。这是我最接近功能示例的:
import UIKit
class MyArray: NSMutableArray {
var array: [Int]?
// Adding an initializer triggers the error: 'required' initializer 'init(arrayLiteral:)' must be provided by subclass of 'NSArray'
// override init() {
// self.array = []
// super.init()
// }
static func makeArray() -> MyArray {
let array = MyArray()
array.array = []
return array
}
override var count: Int {
get {
if let count = array?.count {
return count
}
return 0
}
}
override func insert(_ anObject: Any, at index: Int) {
print("insert called")
}
override func removeObject(at index: Int) {
print("removeObject called")
}
override func add(_ anObject: Any) {
print("Trying to add \(anObject)")
if let newInt = anObject as? Int {
array?.append(newInt)
}
}
override func removeLastObject() {
print("removeLastObject called")
}
override func replaceObject(at index: Int, with anObject: Any) {
print("replaceObject called")
}
}
func append42(array: NSMutableArray) {
array.add(42)
}
let myArray = MyArray.makeArray()
print("Before: \(myArray.array)")
myArray.array?.append(42)
// The following two lines generate a SIGABRT
//myArray.add(42)
//append42(array: myArray)
print("After: \(myArray.array)")
但是,使用add 方法总是会触发SIGABRT。我在 Catalina 上使用 XCode 12.4。
编辑(澄清):我知道 Swift 将 Arrays 连接到 NSArrays。但是,我需要将对 Swift 数组的引用传递给一些接受 NSMutableArray 并可能对数组进行更新的 Objective-C 代码。
本质上,我正在向现有项目添加一些 Swift 代码,并且我想在新代码中使用 Swift 类型数组,但我仍将这些数组传递给旧代码。我知道我可以制作 Swift 数组的 NSMutableArray 副本,将此副本传递给旧代码,然后将其复制回 Swift 数组,但它相当复杂且难以维护。我试图做的是将 Swift 数组的引用封装到一个“NSMutableArray”子类中,这样我就可以透明地使用这个子类和遗留代码。
【问题讨论】:
-
array子类中的array属性的想法不太合理。如果您真的不希望将 SwiftArray复制到NSMutableArray的 Swift 值语义(在大多数情况下,FWIW 并不重要),我想知道您为什么不直接使用NSMutableArray,例如,let values: NSMutableArray = [1, 2]。您也可以使用values.add(42)并将其作为参数传递给您的Objective-C 方法。很明显,你失去了 Swift 泛型Array类型的很多好处,但这伴随着使用旧的 ObjC API 并坚持引用语义。 -
我可能会建议分享有关 Objective-C API 以及您正在处理的数组的性质的更多信息,我们也许可以提供更好的建议...
-
我编辑了原始帖子并添加了一些额外的细节。这个想法是避免在每次我需要调用一些遗留函数时将 Swift
array复制到NSMutableArray并返回。 -
@Rob 当然,我可以在 Swift 中使用
NSMutableArray,但我会失去 Swift 键入Arrays 的好处。同样,我想要做的是提供一个从 SwiftArray到NSMutableArray的透明桥梁(类似于 Apple 提供的从Array到NSArray)。封装对 SwiftArray的引用似乎是最合乎逻辑的选择。
标签: arrays swift nsmutablearray