programing

'pure' Swift에서 약한 프로토콜 참조를 만드는 방법(@objc 없음)

telecom 2023. 4. 20. 20:01
반응형

'pure' Swift에서 약한 프로토콜 참조를 만드는 방법(@objc 없음)

weak 것 .protocol라고 @objc순수한 스위프트 앱에서는 원하지 않습니다.

에러 에러)를 .weak 타입에는 할 수 .MyClassDelegate

class MyClass {
  weak var delegate: MyClassDelegate?
}

protocol MyClassDelegate {
}

프로토콜에 접두사를 붙여야 합니다.@objc작합니니다다

'순수한' 스위프트를 '순수한 스위프트는?weak delegate

.AnyObject.

protocol ProtocolNameDelegate: AnyObject {
    // Protocol stuff goes here
}

class SomeClass {
    weak var delegate: ProtocolNameDelegate?
}

「」를 사용합니다.AnyObject클래스만 이 프로토콜을 준수할 수 있지만 구조나 에넘은 준수할 수 없다고 합니다.

보충 답변

나는 항상 대표자들이 약해야 하는지 말아야 하는지에 대해 혼란스러웠다.최근 대리인과 약한 레퍼런스를 사용하는 시기에 대해 더 많이 알게 되었으므로, 향후 시청자를 위해 여기에 몇 가지 보충 사항을 추가하겠습니다.

  • 「 」의 weak키워드는 강력한 기준 사이클(표준 사이클)을 회피하는 것입니다.강력한 참조 사이클은 두 클래스 인스턴스가 서로 강한 참조를 가질 때 발생합니다.참조 카운트가 0이 되지 않기 때문에 할당 해제되지 않습니다.

  • 사용하시면 .weak딜러가 클래스인 경우.스위프트 구조 및 enum은 참조 유형이 아닌 값 유형(새 인스턴스 작성 시 값이 복사됨)이므로 강력한 참조 사이클을 만들지 않습니다.

  • weak할 수 경우).unowned )을 사용합니다.var)let) 을 (으로 설정할 수 있도록 합니다.nil할당이 해제되었을 때.

  • , 따라서 부모 클래스는 자녀 클래스를 하지 않아야 합니다.weak키워드를 지정합니다.는 ''를 사용해서 약한 참조로 만들어야 .weak키워드를 지정합니다.

  • weak부모만 참조하는 자녀가 아니라 소유하지 않은 클래스에 대한 참조를 원할 때 사용해야 합니다.두 비계층 클래스가 서로 참조해야 하는 경우 약한 클래스를 선택합니다.상황에 따라 당신이 선택하는 것이 달라집니다.자세한 내용은 이 질문에 대한 답변을 참조하십시오.

  • 일반적으로 대부분의 딜러가 자신이 소유하지 않은 클래스를 참조하고 있기 때문에 딜러에게 마크를 붙여야 합니다.이것은 아이가 부모와 통신하기 위해 대리자를 사용할 때 확실히 해당됩니다. 문서에서는 대리인에 대해 약한 참조를 사용하는 것을 권장하고 있습니다(단, 이것도 참조하십시오).

  • 프로토콜은 기준 유형(클래스)과 값 유형(구조, 열거형) 모두에 사용할 수 있습니다.따라서 대리인을 약하게 만들어야 할 경우 개체 전용 프로토콜로 만들어야 합니다.그 방법은 다음과 같이 추가하는 것입니다.AnyObject에는 이 이했습니다.class, 현재는 권장됩니다.

    protocol MyClassDelegate: AnyObject {
        // ...
    }
    
    class SomeClass {
        weak var delegate: MyClassDelegate?
    }
    

상세 조사

다음 기사를 읽음으로써 나는 이것을 더 잘 이해할 수 있었다.은 또한 합니다.unowned키워드 및 클로징과 함께 발생하는 강력한 참조 사이클.

관련된

AnyObject재빠르다

class MyClass {
    weak var delegate: MyClassDelegate?
}

protocol MyClassDelegate: AnyObject {
}

Apple에서:

강한 참조 사이클을 방지하려면 딜러를 약한 참조자로 선언해야 합니다.취약한 참조에 대한 자세한 내용은 클래스 인스턴스 간의 강력한 참조 주기를 참조하십시오.프로토콜을 클래스 전용으로 표시하면 나중에 대리자가 약한 참조를 사용해야 함을 선언할 수 있습니다.Class-Only Protocols에서 설명한 바와 같이 AnyObject에서 상속하여 프로토콜을 클래스 전용으로 표시합니다.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html #//apple_ref/doc/uid/TP40014097-CH25-ID276

업데이트 : 매뉴얼이 갱신되어 참조했던 예가 삭제된 것 같습니다.위의 @flainez 답변에 대한 편집을 참조하십시오.

오리지널:Obj-C와 상호 운용하지 않더라도 @objc를 사용하는 것이 올바른 방법입니다.그러면 프로토콜이 열거형이나 구조가 아닌 클래스에 적용됩니다.매뉴얼의 "프로토콜 준수 검사"를 참조하십시오.

취약한 한정자는 참조 개체에만 적용됩니다.를 추가하지 않는 한@objc,AnyObject , 「」class프로토콜의 한정자가 프로토콜에 적합한 개체가 참조 개체가 아닐 수 있습니다.

따라서 이러한 조건을 충족해야 합니다(및AnyObject만합니다.class을 이용하다

「」, 「」를 추가하는 것에 해 주세요.@objc"순수 Swift" 어플리케이션에서도 클래스 및 자산에 대한 정보가 필요할 수 있습니다.개발 언어와는 상관이 없습니다.이를 통해 컴파일러는 일부 OS 인터페이스(타깃/액션 및 오래된 스타일의 키 경로 등)에 필요한 Objective-C 런타임과 호환되는 방식으로 코드를 빌드합니다.

protocol MyProtocol {
    func doSomething()
}

class MyClass: MyProtocol {
    func doSomething() {
        print("Doing something")
    }
}

var weakProtocol: Weak<MyProtocol>?
let myObject = MyClass()
weakProtocol = Weak(myObject)
weakProtocol?.doSomething() // Will print "Doing something"

프로토콜은 AnyObject의 하위 클래스, 클래스여야 합니다.

이하에 나타내는 예

    protocol NameOfProtocol: class {
   // member of protocol
    }
   class ClassName: UIViewController {
      weak var delegate: NameOfProtocol? 
    }

Apple은 "class" 대신 "NSObjectProtocol"을 사용합니다.

public protocol UIScrollViewDelegate : NSObjectProtocol {
   ...
}

이 방법도 유효하며, 독자적인 위임 패턴을 실장하려고 했을 때에 발생한 에러를 없앱니다.

언급URL : https://stackoverflow.com/questions/24066304/how-can-i-make-a-weak-protocol-reference-in-pure-swift-without-objc

반응형