1

List< T > を NSCopying に準拠させようとしています。できない理由:

  1. @objc は、ジェネリック クラスの拡張内ではサポートされていません。
  2. List は最終クラスなので継承できません。
  3. 「public func copy(with zone: NSZone? = nil) -> Any」を実装した場合、conform NSCopying をマークせずに実行します。エラーが表示されます:「...copyWithZone:]: 認識されないセレクターがインスタンスに送信されました」

したがって、List< T > には copy() がありますが、実際には使用できません。

現在、反復を使用して List< T > の外でコピーを作成する必要があります。単純に instanceOfList.copy() を使用することはできません。

4

1 に答える 1

1

Objective-C からジェネリック コンテキスト内でコピーしようとしている場合を除き、コピー メンバー関数で拡張するためにList<T>適合させる必要はありません。は、純粋な Swift で使用する意味があまりないレガシー プロトコルです。これはクラスにバインドされており、あまり優れた型シグネチャはありません。NSCopyingNSCopying

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)を取得するために使用できます。ArrayList

于 2016-08-29T17:30:35.797 に答える