program tip

Swift에서 대문자 "Self"와 소문자 "self"의 구별

radiobox 2020. 11. 21. 14:16
반응형

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.

참고URL : https://stackoverflow.com/questions/27863810/distinction-in-swift-between-uppercase-self-and-lowercase-self

반응형