'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에서 상속하여 프로토콜을 클래스 전용으로 표시합니다.
업데이트 : 매뉴얼이 갱신되어 참조했던 예가 삭제된 것 같습니다.위의 @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
'programing' 카테고리의 다른 글
단일 개별 열을 기준으로 고유한 행 선택 (0) | 2023.04.20 |
---|---|
Git 및 고약한 "오류: 기존 정보/참조를 잠글 수 없습니다" (0) | 2023.04.20 |
WPF 도구 모음: 그립 및 오버플로 제거 방법 (0) | 2023.04.20 |
왜 항상 '--set-upstream'을 해야 하나요? (0) | 2023.04.15 |
커스텀 함수를 사용하여 C#에서 Excel /xlsm 워크북을 저장하지 않고 닫는 방법 (0) | 2023.04.15 |