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