Различие в Swift между прописными "Self "и строчными" self"
во время игры на быстрой игровой площадке я заметил, что Self
, с заглавной буквы "S", доступен вместе со строчными буквами self
. Есть ли разница между ними? Если да, то каковы обычаи для этих двух, особенно для Self
?
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 может использоваться для ссылки на тип, который подтверждает протокол.