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
'source' 카테고리의 다른 글
Powershell에서 32/64비트 결정 (0) | 2023.10.31 |
---|---|
GLib 기능을 사용하는 이유는 무엇입니까? (0) | 2023.10.31 |
C#에서 HTTP Post 데이터를 가져오는 방법? (0) | 2023.10.26 |
C 소비용 C++ 클래스 API 포장 (0) | 2023.10.26 |
가변 인수는 gcc에서 어떻게 구현됩니까? (0) | 2023.10.26 |