source

Swift 프로토콜 오류: 클래스 유형이 아닌 경우 'weak'을(를) 적용할 수 없습니다.

nicesource 2023. 10. 26. 21:16
반응형

Swift 프로토콜 오류: 클래스 유형이 아닌 경우 'weak'을(를) 적용할 수 없습니다.

프로토콜과 클래스 경계 프로토콜의 차이점은 무엇이며 스위프트에서는 어떤 것을 사용해야 합니까?

protocol A : class { ... }

protocol A { ... }

a를 추가하려고 하면 오류가 발생합니다.weak프로토콜이 다음과 같이 정의되지 않은 경우 위임합니다.: class:

protocol A { ... }

weak var delegate: A

오류를 제공합니다.

'weak'은(는) 클래스가 아닌 유형에 적용할 수 없습니다.

아니면

'weak'을(를) 클래스 바인딩되지 않은 'A'에 적용하면 안 됩니다. 클래스 바인딩이 있는 프로토콜 준수 추가를 고려하십시오.

스위프트 >= 4:

protocol A : AnyObject { ... }

스위프트 < 4:

protocol A : class { ... }

"클래스 전용 프로토콜"을 정의합니다.클래스 유형(구조나 열거형이 아닌)만 이 프로토콜을 채택할 수 있습니다.

약한 참조는 참조 유형에 대해서만 정의됩니다.클래스는 참조 유형이고, 구조와 열거는 값 유형입니다. (클로져도 참조 유형이지만, 클로져는 프로토콜을 채택할 수 없으므로 이 경우에는 무관합니다.

따라서 프로토콜을 준수하는 개체를 취약한 속성에 저장해야 하는 경우 프로토콜은 클래스 전용 프로토콜이어야 합니다.

클래스 전용 프로토콜이 필요한 또 다른 예는 다음과 같습니다.

protocol A { 
    var name : String { get set }
}

func foo(a : A) {
    a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant
}

구조 및 열거형 인스턴스의 경우 다음과 같은 이유로 컴파일되지 않습니다.a.name = "bar"의 돌연변이 입니다.a. 프로토콜을 다음과 같이 정의하는 경우

protocol A : class { 
    var name : String { get set }
}

그러면 컴파일러는 그것을 알고 있습니다.a클래스 유형의 예입니다.a는 객체 저장소에 대한 참조이며,a.name = "bar"참조된 개체를 수정하지만 수정하지는 않습니다.a.

따라서 일반적으로 프로토콜을 채택하는 유형이 값 유형이 아닌 참조 유형이어야 하는 경우 클래스 전용 프로토콜을 정의합니다.

Swift 4 이상을 사용하는 경우 를 사용합니다.AnyObject:

protocol A : AnyObject { ... }

사용.class이전과 마찬가지로 다음과 같이 경고:

class' 키워드를 사용하여 클래스 제한 프로토콜을 정의하는 것은 더 이상 사용되지 않습니다. 대신 'AnyObject'를 사용하십시오.

'class'를 'AnyObject'로 바꿉니다.

NSObject 또는 AnyObject와 같은 클래스 유형에서 프로토콜을 파생할 수 있습니다.

protocol TopNewsTableDelegate : AnyObject {
    func topNewsTableDidLoadedStories()
}

아니면 이렇게 입력하시면 됩니다.

@objc protocol A { ... }

그러면 당신은 약한 대리인을 언급할 수 있습니다.

protocol CustomProtocolName : NSObjectProtocol {
  // ...
}

언급URL : https://stackoverflow.com/questions/33471858/swift-protocol-error-weak-cannot-be-applied-to-non-class-type

반응형