WeakBox требует, чтобы WeakArray <Element>.Element был типом класса - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь реализовать решения для хранения слабых ссылок из переговоров objc (https://www.objc.io/blog/2017/12/28/weak-arrays/), но я не могу заставить его работать.

Точное сообщение об ошибке говорит:

'WeakBox' requires that 'WeakArray<Element>.Element' (aka 'Optional<Element>') be a class type

enter image description here

С этим кодом:

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 })

1 Ответ

0 голосов
/ 23 января 2019

Я считаю, что «Элемент» где-то переопределяется SDK. Переименование элемента в T должно исправить проблему.

import Foundation

final class WeakBox<T:AnyObject> {
    weak var unbox: T?
    init(_ value: T?) {
        unbox = value
    }
}

struct WeakArray<T: AnyObject> {
    private var items: [WeakBox<T>] = []

    init(_ elements: [T]) {
        items = elements.map { WeakBox($0) }
    }

    init(_ elements: [T?]) {
        items = elements.map { WeakBox($0) }
    }

    mutating func append(_ obj:T?) {
        items.append(WeakBox(obj))
    }

    mutating func remove(at:Int) {
        items.remove(at: at)
    }
}

extension WeakArray: Collection {
    var startIndex: Int { return items.startIndex }
    var endIndex: Int { return items.endIndex }

    subscript(_ index: Int) -> T? {
        return items[index].unbox
    }

    func index(after idx: Int) -> Int {
        return items.index(after: idx)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...