Swift-프로토콜 구성 시
너의 유형은 틀렸니?
우선 아래 코드를 보십시오.
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()
pet
의 유형은?Cat
인가 Dog
동태 결정Cat
도 Dog
Animal
도 아니다.플레이그라운드 장르를 봤는데 인스펙터도 많이 썼어요.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) 을 실현할 때만 볼 수 있습니다.
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 {/*…*/}
그러니까
Reference
이 문제에 관하여(Swift-프로토콜 구성 시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dankogai/items/5e8a96f707aa00710f14텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)