Я пытаюсь реализовать решения для хранения слабых ссылок из переговоров objc (https://www.objc.io/blog/2017/12/28/weak-arrays/), но я не могу заставить его работать.
Точное сообщение об ошибке говорит:
'WeakBox' requires that 'WeakArray<Element>.Element' (aka 'Optional<Element>') be a class type
С этим кодом:
final class WeakBox<A: AnyObject> {
weak var unbox: A?
init(_ value: A) {
unbox = value
}
}
struct WeakArray<Element: AnyObject> {
private var items: [WeakBox<Element>] = []
init(_ elements: [Element]) {
items = elements.map { WeakBox($0) }
}
init() {}
}
extension WeakArray: Collection {
var startIndex: Int { return items.startIndex }
var endIndex: Int { return items.endIndex }
subscript(_ index: Int) -> Element? {
return items[index].unbox
}
func index(after idx: Int) -> Int {
return items.index(after: idx)
}
mutating func append(_ element: Element) {
items.append(WeakBox(element))
}
mutating func removeAll() {
items.removeAll()
}
}
**
Обновление:
**
Через некоторое время я понял, что сообщение об ошибке полностью вводит в заблуждение. Настоящая проблема заключается в вызове методов протокола Sequence . Например, добавление чего-то подобного ниже приводит к сообщению об ошибке из приведенного выше снимка экрана. Но я пока не нашел решения.
class De {
let de = "de"
}
let de = De()
var ar = WeakArray<De>([])
ar.append(de)
ar.append(de)
ar.forEach({ $0 })