SWIFTプロトコル(2020.11.3)

13556 ワード

プロトコル


プロトコル
定義方法、Property、頭文字Riserなどの要件.
構造体、クライアント、および列挙式はプロトコルを採用します.
プロトコル要件の実装
どのプロトコルの要件も満たすタイプ
契約を守る
合意の要件を満たすために、
すべて体現しなければならない

定義#テイギ#

protocol 프로토콜 이름 {
	/*정의부*/
}

protocol Talkable{
	// 프로퍼티 요구
    // 프로퍼티 요구는 항상 var 키워드를 사용한다
    // get은 읽기만 가능해도 상관없다는 뜻이다
    // get과 set을 모두 명시하면
    // 읽기 쓰기 모두 가능한 프로퍼티여야 한다
    var topic: String {get set}
    var language: String {get}
    
    // 메서드 요구
    func talk() // 필요한 메서드만 표시하고, 자세한 코드는 프로토콜을 상속받는 클래스? 함수? 에서 구현한다.
    
    // 이니셜라이저 요구
    init(topic: String, language: String)
}

契約の採用と遵守

sturct Person : Talkable{
	var topic : String
    let language : String
    
    // 읽기전용 프로퍼티 요구는 연산 프로퍼티로 대체가 가능합니다.
    // var languange: String {return "한국어"}
    // 위와 아래 코드는 동일한 코드이다
    // var languange: String {get { return "한국어"} }
    
    물론 읽기, 쓰기 프로퍼티도 연산 프로퍼티로 대체할 수 있습니다.
    var subject : String = ""
    var topic : String {
    	set {
        	self.subject = newValue
        }
        get {
        	return self.subject
        }
    }
    
    func talk(){
    	print("\(topic)에 대해\(language)로 말합니다.")
    }
    init(topic: String, language: String){
    	self.topic = topic
        self.language = language
    }
}

プロトコルの継承


プロトコルはクラスと完全に一致します.
/*
protocol 프로토콜 이름: 부모 프로토콜 이름 목록{
	/* 정의부 */
}
*/

protocol Readable{
	func read()
}

protocol Writeable{
	func write()
}

protocol ReadSpeakable: Readable {
	// func read() // Readable 에서 상속을 받아서 read 함수를 이미 가지고 있다.
    func speak()
}

protocol ReadWriteSpeakable: Readable, Writeable{
	// func read()
    // func write()  // Readable과 Writeable 프로토콜을 상속받아서 read write 함수를 가지고 있다.
    func speak()
}

struct SomeType: ReadWriteSpeakable{
	func read(){
    	print("Read")
    }
    
    func write(){
    	print("Write")
    }
    
    func speak(){
    	print("Speak")
    }
}

// 정의한 것들 중에 하나라도 빠진것이 있다면 
//struct SomeType: ReadWriteSpeakable{ 
//    func speak(){
//    	print("Speak")
//    }
//}

クラス継承とプロトコル


クラスで継承とプロトコルを同時に使用するには
まず継承するクラスを宣言します.
次に、使用するプロトコルのリストを作成します.
class SuperClass: Readable {
func read() { print("read") }
}
class SubClass : SuperClass, Writeable, ReadSpeakable {
func write() { print("write") }
func speak() { print("speak") }
}

プロトコルコンプライアンスの検証


インスタンスが特定のプロトコルに合致しているかどうか.
is as演算子の使用
let sup: SuperClass = SuperClass()
let sub : SubClass = SubClass()

var someAny : Any = sup
someAny is Readable // true
someAny is ReadSpeakable // false

someAny = sub
someAny is Readable // true
someAny is ReadSpeakable // true

someAny = sup

if let someReadable : Readable = someAny as? Readable {
	someReadable.read()
}// read

if let someReadSpeakable : ReadSpeakable = someAny as? ReadSpeakable{
	someReadSpeakable.speak()
} // 동작하지 않음

someAny = sub

if let someReadable: Readable = someAny as? Readable {
	someReadable.read()
} // read
ソース:youtube“yagom”