Не удается привести список областей‹T› в соответствие с NSCopying

Я пытаюсь заставить List‹ T > соответствовать NSCopying. Я не могу, потому что:

  1. @objc не поддерживается в расширениях универсальных классов.
  2. Я не могу наследовать список, так как это последний класс.
  3. Если я реализую «общедоступную копию функции (с зоной: NSZone? = nil) -> Any» без маркировки, соответствующей NSCopying. Я просто получаю сообщение об ошибке: "...copyWithZone:]: в экземпляр отправлен неизвестный селектор"

Таким образом, несмотря на то, что в List‹ T > есть функция copy(), мы никогда не сможем ее использовать.

Текущий я должен сделать копию за пределами List‹ T>, используя итерацию. Я не могу просто использовать instanceOfList.copy().


person Owen Zhao    schedule 24.08.2016    source источник


Ответы (1)


Нет необходимости заставлять List<T> соответствовать NSCopying, чтобы расширить его с помощью функции-члена копирования, если только вы не пытаетесь скопировать его в общем контексте из Objective-C. NSCopying — это устаревший протокол, который не имеет смысла использовать в чистом Swift. Он привязан к классу и не имеет очень хорошей подписи типа.

Если вы пытаетесь использовать NSCopying в общем контексте в чистом Swift, рассмотрите возможность определения собственного протокола Copyable и расширения типов, чтобы соответствовать этому. Поскольку это не @objc, все должно быть в порядке. Существующие типы, которые уже соответствуют NSCopying, потребуют, чтобы расширения также соответствовали Copyable, но вы можете поместить логику в расширение NSCopying.

import Foundation

protocol Copyable {
    mutating func copy() -> Self
}

extension NSCopying {
    func copy() -> Self {
        return copy(with: nil) as! Self
    }
}

extension MyTypeThatConformsToNSCopying: Copyable { }

Теперь мне немного любопытно, почему вы пытаетесь привести List<T> в соответствие с NSCopying. Вы ищете неуправляемую копию списка? Вы можете просто использовать Array(myList), чтобы получить Array из List.

person jadengeller    schedule 29.08.2016
comment
да. Я пытался сделать неуправляемую копию. Причина, по которой я хотел внедрить NSCopying, была проста. Уже была копия(), унаследованная от NSObject. - person Owen Zhao; 31.08.2016