Различие в Swift между прописными "Self "и строчными" self"


во время игры на быстрой игровой площадке я заметил, что Self, с заглавной буквы "S", доступен вместе со строчными буквами self. Есть ли разница между ними? Если да, то каковы обычаи для этих двух, особенно для Self?

4 52

4 ответа:

Self относится к типу текущей "вещи" внутри протокола (все, что соответствует протоколу). Пример его использования см. В разделе функция протокола, возвращающая себя.

только официальные документы, которые я нашел для Self находится в Протокол, Связанный С Объявлением Типа на языке программирования Swift. Это удивительно не задокументировано в разделах по протоколам или по вложенным типам.

в декларации расширением протокола и использовать самостоятельно еще самостоятельно

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 может использоваться для ссылки на тип, который подтверждает протокол.