Swift에서 대문자 "Self"와 소문자 "self"의 구별
Swift 놀이터에서 놀면서 Self
대문자 "S"가 소문자와 함께 사용 가능 하다는 것을 알았습니다 self
. 그들 사이에 어떤 차이가 있습니까? 그렇다면이 두 가지, 특히 Self
?
Self
프로토콜 내부의 현재 "사물"유형을 나타냅니다 (프로토콜을 준수하는 것). 사용 예는 Self를 반환하는 Protocol func를 참조하십시오 .
I가 발견 한 공식 문서는 Self
에 프로토콜 관련 유형 선언 스위프트 프로그래밍 언어에. 놀랍게도 프로토콜 또는 중첩 유형에 대한 섹션에 문서화되어 있지 않습니다.
그러나 이제 형식 에 대한 공식 Swift Programming Language의 장에 코드 예제를 포함하는 것에 대한 단락Self Type
이 있습니다.
프로토콜 및 확장 선언에서 Self else 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 can also be used as a return type in the protocol extension method body which will return confirming type instance, and for type casting with "as". Please see example below:
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
In the nutshell, Self can be used to refer the Type which confirms to the protocol.
'program tip' 카테고리의 다른 글
수면 종류의 시간 복잡성은 무엇입니까? (0) | 2020.11.21 |
---|---|
Haskell : non-strict와 lazy는 어떻게 다른가요? (0) | 2020.11.21 |
Windows Forms 애플리케이션에서 MVC를 어떻게 구현 하시겠습니까? (0) | 2020.11.21 |
SQL Server 2008의 SQL 프로필러는 어디에 있습니까? (0) | 2020.11.21 |
Secure.ANDROID_ID는 각 장치마다 고유합니까? (0) | 2020.11.21 |