Swiftプレイグラウンドでプレイしているとき、小文字のSelf
に加えて、大文字の "S"でself
が利用できることに気付きました。それらに違いはありますか?だから、これらの2つの使用法、特にSelf
の使用法は何ですか?
Self
は、プロトコル内の現在の「もの」のタイプ(プロトコルに準拠しているもの)を指します。その使用例については、 Self を返すプロトコル関数を参照してください。
Self
で見つけた公式ドキュメントは、 Protocol Associated Type Declaration in the Swift Programming Language。それは驚くべきことではありませんプロトコルまたはネストされたタイプに関するセクションに記載されています。
ただし、現在、公式のSwiftプログラミング言語の 章のコード例を含むSelf Type
についての 段落があります。タイプについて
プロトコルおよび拡張宣言ではSelfまたはselfを使用します
extension protocolName where Self: UIView
{
func someFunction()
{
self.layer.shadowColor = UIColor.red.cgColor
}
}
Self
はクラスでも使用でき、便利です。 ここ はそれに関する記事です。
以下に例を示します。 MyClass
というクラスがあります。 MyClass
には、そのインスタンスを返すメソッドがあります。ここで、MyClass
というMySubclass
のサブクラスを追加します。これらのメソッドは、MySubclass
ではなくMyClass
のインスタンスを返すようにします。次のコードは、その方法を示しています。メソッドは、インスタンスメソッドまたはクラスメソッドのいずれかであることに注意してください。
class MyClass: CustomStringConvertible {
let text: String
// Use required to ensure subclasses also have this init method
required init(text: String) {
self.text = text
}
class func create() -> Self {
return self.init(text: "Created")
}
func modify() -> Self {
return type(of: self).init(text: "modifid: " + text)
}
var description: String {
return text
}
}
class MySubclass: MyClass {
required init(text: String) {
super.init(text: "MySubclass " + text)
}
}
let myClass = MyClass.create()
let myClassModified = myClass.modify()
let mySubclass = MySubclass.create()
let mySubclassModified = mySubclass.modify()
print(myClass)
print(myClassModified)
print(mySubclass)
print(mySubclassModified)
次の行が出力されます。
// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
Selfは、プロトコル拡張メソッド本体で戻り型として使用することもできます。これは、確認型インスタンスを返し、「as」を使用した型キャストに使用できます。以下の例をご覧ください。
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
一言で言えば、Selfは、プロトコルを確認するTypeを参照するために使用できます。