2014-06-24 3 views
4

브라우징 스위프트의 라이브러리 코드는 내가 발견했습니다스위프트에서 모든 유형을 확장 하시겠습니까?

extension T! : Printable { 
    var description: String { get } 
} 

코드 조각은 '설명'필드의 모든 유형을 확장 할 것으로 보인다. 내 코드에서 같은 일을하려고 할 때 , 내가 얻을 오류 :

그러나 그들은 해결하기 위해 실패합니다

  • 여기 무슨 일이야? 왜 도서관 코드는 괜찮지 만 내 코드는 ... 아닌가?
  • 특정 프로토콜을 준수하는 모든 유형 또는 모든 유형이 가능합니까?
+1

비슷한 질문 (대답이 없습니다) : http://stackoverflow.com/questions/24185549/whats-the-difference-between-optionalt-and-optional-types-in-swift-error-ha. –

+2

스위프트 개발자가 일부 기능을 자체적으로 유지하면서 [여기에 몇 가지 표준이 적용됩니다] (http://en.wikipedia.org/wiki/Quod_licet_Iovi,_non_licet_bovi)가있을 수 있습니다. – dasblinkenlight

+0

네 말이 맞아!라이브러리 코드가 작동하지만 내 코드가 컴파일되지 않는 이유를 알고 싶습니다. – Andy

답변

7

우선 모든 유형을 확장하지는 않습니다. T!으로 확장되며 ImplicitlyUnwrappedOptional<T>입니다. 따라서 모든 유형이 아닌 암시 적으로 언 래핑 된 선택적 유형을 확장합니다.

"머리글"은 실제로는 신속한 코드가 아닙니다. 자동으로 생성됩니다. 자동 헤더 생성기에 버그가있어 일부 경우 실제 Swift 코드가 생성되지 않을 수 있습니다. 문자 그대로 받아들이지 마라.

당신이 자동으로 생성 "헤더"에 주목 한 이상한 것은 특정 기본 구문 수축이 일관성이 적용되는 것입니다 - 유형 선언이 수축을 사용하지 않지만, 확장을 수행합니다

struct Array<T> 
extension T[] 

enum Optional<T> 
extension T? 

struct ImplicitlyUnwrappedOptional<T> 
extension T! 

아마도 자동 헤더 생성기의 일부 코드가 위의 유형을 계약 식 구문으로 바꿔 치기했을 것입니다. 그래서 먼저 extension T!이 실제로 extension ImplicitlyUnwrappedOptional<T>이라고 말하는 척합니다.

그러나 "은"선언되지 않은 유형 'T'사용 "오류와 함께 컴파일되지 않습니다. 사실, 자동으로 생성 된 "헤더"에서 형식 매개 변수를 사용하여 확장 선언의 많은 인스턴스를 찾았습니다. extension Dictionary<KeyType, ValueType>, Swift에서는 컴파일되지 않습니다. 이것은 자동 헤더 생성과 관련된 또 다른 버그입니다.

extension ImplicitlyUnwrappedOptional : MyProtocol { 
    // ... 
} 

이 정확히 무엇을하는 것은 this answer에 표시됩니다되어

그러나 형식 매개 변수를 작품을 제거.

관련 문제