Swift-프로토콜 구성 시

6270 단어 GenericsSwiftProtocol
@koher선생님의 글, Swift 프로토콜은 Generix를 지원하지 않는 이유에서의 토론은 다시 보도할 가치가 있기 때문에 그렇게 하기로 했습니다.

너의 유형은 틀렸니?


우선 아래 코드를 보십시오.
import Foundation

protocol Animal {
    var binomen:String { get }
    init()
}
struct Cat: Animal {
    let binomen = "Felis silvestris catus"
    let theYoung = "kitten"
}
struct Dog: Animal {
    let binomen = "Canis lupus familiaris"
    let theYoung = "puppy"
}

var pet:Animal = (arc4random() & 1 == 1) ? Cat() : Dog()
  • Q0: 이 코드는 이동하는 건가요?
  • A0: 이동
  • A1: (type mismartch 부동)
  • 정답은 A0입니다. 잘 행동하세요.Playgrounds 또는 REPL을 사용하여 확인하십시오.그럼 본론입니다.
  • Q1: pet의 유형은?
  • A0: Cat인가 Dog동태 결정
  • A1: 정적 결정 유형
  • 정답은 A1입니다.그리고 유형의 이름도 CatDogAnimal도 아니다.
    플레이그라운드 장르를 봤는데 인스펙터도 많이 썼어요.binomen에 접근할 수 있어도theYoung에 액세스할 수 없습니다.아무거나.theYoung은 존재하지만 Animal은 알 수가 없어요. let 🐱 = Cat() 🐱.theYoung // "kitten" let 🐶 = Dog() 🐶.theYoung // "puppy" 그러면 pet = Animal() 움직일 것 같지만 protocol type Animal'cannot be instantiated에게 욕을 먹습니다.도대체 struct인지 enum인지class인지,protocol은 원래의'규약'으로 사용된다. 이를 알면 스위프트의 총칭형(generics) 디자인을 알 수 있다. 모든 상수 (let) 와 변수 (var) 의 형식은 컴파일할 때 정적으로 결정됩니다. 정말, 이게 다야.무엇 때문에 func ditto<T>(x:T)->T { return x } 오케이인데. let ditto<T>:(T)->T = { $0 } NG야?그게 이유야.T에 뭐가 있는지 컴파일할 때 결정해야 합니다.실행할 때 결정되는 언어라면 // ECMAScript const ditto = (x)=>x 그곳과 크게 다르다.Type<T>OK, Protocol<T>NG도 그거예요.그 고민을 해결한 건 associated type,Protocol입니다. protocol Sequence { associatedtype Element } Element 유형이 강제로 포함된 경우 struct Array<Element> : Sequence { //... } 이렇게 하면 확실히 정태적으로 틀을 결정할 수 있다.그리고 지금 // Element이 Numeric인 경우에만 해당합니다.할 수 있도록. extension Array where Element:Numeric { func sum()->Element { return self.reduce(0, +) } } 이렇게 하면 확장된 범위를 제한할 수도 있다. 총결산 이대로 멈춰. Swift의 상수 및 변수 유형은 100% 정적입니다.예외는 흡입관 프로토콜 (protocol) 은 실제로도 형식이 있지만, 이러한 형식은 간접적으로 호환되는 형식 (struct, enum or class) 을 실현할 때만 볼 수 있습니다.
  • enum을 사용하면 "다양한 유형"(예: swift-sion )
  • "무엇이든 들어갈 수 있는 타입"Any으로도 준비됐지만 어떻게 사용하지 않는 것이 관건
  • 이 방면의 느낌은 실제로 직접 제작하면 잘 알 수 있다.유쾌한 비.
    Dan the Safe, Fast and Expressive

    애니의 정체


    평론의 토론도 있지만, 이것은 반드시 특별히 기재해야 한다.실제로'무엇이든 들어갈 수 있다'형Any도 협의형이다.실제로도 명확하게 Any를 협의로 사용할 수 있다.
    struct Whatever:Any {} // no error
    
    REPL로 들여다보면Any.self그것을똑똑히 알 수 있다.
    1> Any.self
    $R0: Any.Protocol = Any
    
    protocol Any {}
    
    그렇다면 모든 유형의 선언 뒤에...
    struct S {/*…*/}
    enum E {/*…*/}
    class C {/*…*/}
    
    은밀히Any 협의를 준수...
    struct S:Any {/*…*/}
    enum E:Any {/*…*/}
    class C:Any {/*…*/}
    
    그러니까

    좋은 웹페이지 즐겨찾기