web-dev-qa-db-ja.com

Swift大文字の「Self」と小文字の「self」の間の区別

Swiftプレイグラウンドでプレイしているとき、小文字のSelfに加えて、大文字の "S"でselfが利用できることに気付きました。それらに違いはありますか?だから、これらの2つの使用法、特にSelfの使用法は何ですか?

64
Eray Diler

Selfは、プロトコル内の現在の「もの」のタイプ(プロトコルに準拠しているもの)を指します。その使用例については、 Self を返すプロトコル関数を参照してください。

Selfで見つけた公式ドキュメントは、 Protocol Associated Type Declaration in the Swift Programming Language。それは驚くべきことではありませんプロトコルまたはネストされたタイプに関するセクションに記載されています。

ただし、現在、公式のSwiftプログラミング言語の 章のコード例を含むSelf Type についての 段落があります。タイプについて

67
Rob Napier

プロトコルおよび拡張宣言ではSelfまたはselfを使用します

extension protocolName where Self: UIView 
{
  func someFunction()
  {
    self.layer.shadowColor = UIColor.red.cgColor
  }
}
7
Devesh

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
7
ukim

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を参照するために使用できます。

1
Neeraj Khede