2014-12-11 4 views
2

프로토콜 채택을 클래스 유형으로 제한하려면 :class 프로토콜 또는 @objc 프로토콜을 사용할 수 있습니다.@objc보다 클래스 전용 프로토콜을 사용해야하는시기는 언제입니까?

그러나 나는 @objc 프로토콜보다 "클래스 전용 프로토콜"의 이점을 보지 못했습니다.

의 차이는 내가 알고

  1. 크기
    @objc이 더 많은 공간이 효율적입니다. 만 @objc 프로토콜에 대한

    @objc protocol ProtocolObjC {} 
    protocol ProtocolClass: class {} 
    
    let obj:AnyObject = NSObject() 
    
    obj is ProtocolObjC // -> false 
    obj is ProtocolClass // < [!] error: cannot downcast from 'AnyObject' to [email protected] protocol type 'ProtocolClass' 
    
  2. 선택 의정서 요구 사항
    을 프로토콜 적합성
    만에 @objc 프로토콜에 대한 확인

    @objc protocol ProtocolObjC {} 
    protocol ProtocolClass: class {} 
    
    sizeof(ProtocolObjC) // -> 8 
    sizeof(ProtocolClass) // -> 16 
    
  3. @objc protocol ProtocolObjC { 
        optional func foo() 
    } 
    protocol ProtocolClass: class { 
        optional func foo() // < [!] error: 'optional' can only be applied to members of an @objc protocol 
    } 
    

: class 프로토콜을 사용해야하는 유스 케이스가 있습니까? 또는 누군가가 @objc의 단점을 알고 있습니까?


ADDED : Thanks @Antonio!

enum MyEnum { case A,B,C } 

@objc protocol ProtoObjC { 

    // Generics 
    typealias FooType 
    var foo:FooType {get set} 

    // Tuple 
    var bar:(Int,Int) {get set} 

    // Enum 
    var baz:MyEnum {get set} 
} 

모두 컴파일 오류가 발생합니다.

답변

1

나는 두 가지가 서로 비교되지 않을 것이라고 생각합니다.

가 빠른 프로토콜을 사용하는 장점은

입니다 엄지 손가락의 제 규칙은 .. 기본 신속한 프로토콜은 항상 objc 호환성이 필요하지 않은 경우, 사용, 또는에만 필요합니다 @objc를 통해 특정 기능을하지 않는 한 사용할 수 있어야한다는 것입니다 그러나 그와 같은 모든 SWIFT 관련 기능, objc에서 사용할 수있는 비, 사용할 수 있습니다 :

  • 제네릭
  • 튜플
  • 신속 열거

그러나 그와 관계없이 나는 여전히 순수한 문체 선택을위한 신속한 프로토콜을 고수 할 것입니다.

+1

"순수한 문체 선택"에 동의합니다. :) – rintaro

관련 문제