SWIFT TOURでSWIFT#7を学ぶ.Protocols and Extensions

10804 ワード

🍫 コンセプトで表示
*この記事はアップル社の「Aswift Tour」に基づいて書かれています.学習や記録のために書かれているので、不正確な情報があるかもしれません.
**コンセプトで作成されたドキュメントなので、写真リンクのエラーやドキュメントのフォーマットが不便になる可能性があります.△写真が出なかったり、コードが見えなかったりしたら、できるだけ早く修正します.

7. Protocols and Extensions


protocol

protocolを使用してプロトコルを宣言します.
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
* **{ get }** : read only.
* **mutating func :** modify the properties of a value type

class, enum, struct can all adopt protocols


クラス、列挙体、構造体はいずれもプロトコルを採用することができる.
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {   //modify
        simpleDescription += "  Now 100% adjusted."
    }
}
var a = SimpleClass()
  // a.adjust()를 수행
a.adjust()
let aDescription = a.simpleDescription
  //  "A very simple class. Now 100% adjusted."

struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
var b = SimpleStructure()
	//  b.adjust()를 수행
b.adjust()
let bDescription = b.simpleDescription
	//  "A simple structure (adjusted)"
⑪簡易構造宣言部の2479142キーワードは、修正構造体を示す.SimpleClassは、クラス内のメソッドが常にクラスを変更できるため、メソッドのタグは必要ないと宣言します.**mutating**ExampleProtocolにその他の必要条件を追加します.SimpleClassとSimpleStructureでは、プロトコルを変更する必要がありますか?
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
    func adjustSecond()
}
ExampleProtocolを採用する場合はfunc adjustSecond()を記入してください.

**experiment**


川ではextensionを使用してタイプに機能を追加します.たとえば、新しいメソッドまたは計算のプロパティです.**익스텐션extension**を使用して、**프로토콜 준수성protocol conformance**にプロトコル整合性を宣言したり、ライブラリまたはフレームワークにロードされたタイプを익스텐션extensionに追加したりできます.
extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
print(7.simpleDescription)
experiment絶対値属性を追加したDouble Type Extensionを作成します.
?????????
extension Double: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    
    mutating func adjust() {
        if self < 0{
            self = abs(self)
        }
    }
}

var number = -7.34
プロトコル名は、他のタイプのネーミングタイプtypeとして使用できます.たとえば、異なるタイプのオブジェクトが単一のプロトコルに従うコレクションを作成できます.処理値タイプがプロトコルタイプの値である場合、プロトコル定義以外のメソッドは使用できません.
let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)
// Prints "A very simple class.  Now 100% adjusted."
// print(protocolValue.anotherProperty)  // Uncomment to see the error
ProtocolValueが単純クラスのランタイムタイプを持っていても、コンパイラはExampleProtocolタイプと見なされます.これは、プロトコルコンプライアンスプロトコルとは異なり、クラスが実行するimplementsメソッドまたは属性に偶然アクセスできないことを意味します.