2016-08-24 6 views
0

목록 NSCopying을 준수하도록 List <을 만들려고합니다. 왜냐하면 다음과 같은 이유 때문입니다.영역을 만들 수 없습니다. 목록 이 NSCopying을 준수합니다.

  1. @objc는 일반 클래스의 확장 내에서 지원되지 않습니다.
  2. 최종 클래스이므로 List를 상속받을 수 없습니다.
  3. "공용 기능 복사본 (영역 : NSZone? = nil) ->"Any without Marking NSCopying "을 구현하는 경우. 난 그냥 오류가 발생합니다 :
그래서

목록 < T> 복사()가 존재하지만, 우리가 정말 그것을 사용하지 않을 수 있습니다 "... copyWithZone가 :] 알 수없는 선택기 인스턴스로 전송".

현재 반복을 사용하여 List < T> 외부의 복사본을 만들어야합니다. 난 단순히 instanceOfList.copy()를 사용할 수 없다.

답변

1

List<T>을 Objective-C의 일반 컨텍스트 내에서 복사하려고하지 않는 한 복사 멤버 함수로 확장하려면 NSCopying을 따를 필요는 없습니다. 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 { } 

지금, 나는 당신이 NSCopyingList<T>을 준수하려고 할 이유 좀 궁금합니다. 관리되지 않는 목록의 복사본을 찾고 있습니까? Array(myList)을 사용하면 List에서 Array을 얻을 수 있습니다.

+0

예. 관리되지 않는 복사본을 만들려고했습니다. NSCopying을 처음부터 구현하려는 이유는 간단했습니다. NSObject에서 상속받은 copy()가 이미 있습니다. –