키워드 "weak"을 클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있는 이유는 무엇입니까?
변를다음같이선언으로 할 때weakSwift에서는 가끔 Xcode에서 다음과 같은 오류 메시지가 표시됩니다.
'weak'은 클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있습니다.
또는
'weak'은 클래스 바인딩되지 않은 'Some Protocol'에 적용되지 않아야 합니다. 클래스 바인딩이 있는 프로토콜 준수를 추가하는 것이 좋습니다.
왜 그 키워드가weak클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있습니까?이 요구사항의 배경은 무엇입니까?
이 중 을 선언했지만 이오의일이사유자프가용신선자다로때니입문에서 입니다.AnyObject:
protocol PenguinDelegate: AnyObject {
func userDidTapThePenguin()
}
class MyViewController: UIViewController {
weak var delegate: PenguinDelegate?
}
다음에서 상속하는 것을 잊어버린 경우 위의 코드가 오류를 제공합니다.AnyObject는 그이는입니다.weak참조 유형(문서)에 대해서만 사용할 수 있습니다.따라서 Penguin Delegate가 가치 유형이 아닌 클래스를 위한 것임을 분명히 함으로써 컴파일러를 덜 긴장하게 만듭니다.
weak유형에 한정자입니다(예: 참유형예한 니다입정자반대한대에조과유값형예▁types(▁as다,▁such▁for▁a▁is니반▁types▁opposed대▁qualifier▁to▁value▁(as입▁reference자).structs 및 기본 제공 값 유형).
참조 유형을 사용하면 동일한 개체에 대한 참조를 여러 개 가질 수 있습니다.마지막 강한 참조가 개체 참조를 중지하면 개체의 할당이 취소됩니다(약한 참조는 카운트되지 않음).
그러나 값 유형은 복사본별로 할당됩니다.참조 카운트가 적용되지 않으므로weak수식어가 그들과 의미가 없습니다.
protocol PenguinDelegate: class {
func userDidTapThePenguin()
}
class MyViewController: UIViewController {
weak var delegate: PenguinDelegate?
}
프로토콜 뒤에 class를 입력하면 NSObjectProtocol에서도 작동하고 더 적합한 것 같습니다.
이 정확하다고 한다면, 로 이 하지 않았는지 확인하세요.:어느 정도로=.
이것이 제가 먹은 것입니다.또한 위와 같은 오류가 발생했습니다.
protocol PenguinDelegate: class {
func userDidTapThePenguin()
}
class MyViewController: UIViewController {
weak var delegate = PenguinDelegate?
}
하지만 올바른 방법은 다음과 같습니다.
protocol PenguinDelegate: class {
func userDidTapThePenguin()
}
class MyViewController: UIViewController {
weak var delegate: PenguinDelegate?
}
차이점을 알겠습니까?제가 대장 대신 등호를 가지고 있다는 것을 확인하는 데 시간이 좀 걸렸습니다.또한 첫 번째 오류가 실제 문제일 가능성이 가장 높다고 판단했기 때문에 동일한 라인에 대해 다른 오류가 발생했습니다.
-
weak및 class-bound protocol 할 수 .
:-<
클래스 유형도 있지만 오류 메시지가 표시되는 경우가 있습니다.
예를들면,
class MyVC: UIViewController {
var myText: UITextView = {
[weak self]
let text = UITextView()
// some codes using self
return text
}()
}
여기서UITextView개체가 익명 블록에서 초기화로 반환됩니다.var myText같은 유형의 오류 메시지가 표시됩니다.이 문제를 해결하려면,var로 표시해야 합니다.lazy:
class MyVC: UIViewController {
lasy var myText: UITextView = {
[weak self]
let text = UITextView()
// some codes using self
return text
}()
}
참고로 업데이트되지 않은 사람만.swift 제안 SE-0156 https://github.com/apple/swift-evolution/blob/master/proposals/0156-subclass-existentials.md 이 구현된 후 Swift 문서 "Class-Only Protocols" 섹션 https://docs.swift.org/swift-book/LanguageGuide/Protocols.html#ID281 에는 클래스 대신 AnyObject를 사용하도록 설명되어 있습니다.따라서 앞으로 : 클래스가 더 이상 사용되지 않을 수 있습니다.
weak는 ARC(Automatic Reference Counting)용입니다.참조 카운트를 추가하지 않음을 의미합니다.그래서 그것은 오직Class그리고 Swift에서는 보안에 대한 옵션 값을 얻을 수 있습니다.
종료를 위해 문자열 및 배열 형식 속성을 캡처하려고 했습니다.다음 오류가 발생했습니다.
'weak'은 '[String]'이 아닌 클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있습니다.
'weak'은 클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있으며 'String'은 적용할 수 없습니다.
저는 놀이터에서 잠시 놀았고, 알고 보니, 이런 유형의 사람들에게는 자아를 포착하는 것으로 충분했습니다.
스크롤뷰를 위해 객관적인 C 클래스를 swift로 사용하고
있었습니다.스크롤 뷰의 IO Butlet을 만들었습니다.그리고 코드를 컴파일하는 동안 이 오류가 나타나기 시작했습니다.
이러한 문제를 해결하려면 브리징 헤더에 있는 클래스를 가져옵니다.
"사용자 클래스"를 가져옵니다.h"
저는 swift 3.2에서 Xcode 9.2를 사용하고 있었습니다.
weak참조 유형에 대해서만 작동하므로, Xcode에서 호출하는 경우 오류가 보고됩니다.struct(대신)class).
- weak는 값 형식이 아닙니다.
- 약한 사람은 수업을 위해서만 사진에 나옵니다.
"weak"은 클래스 또는 클래스 바인딩 프로토콜 유형에서 상속된 모든 것을 적용할 수 있습니다.
- 클래스 프로토콜: protocol ViewControllerDelegate : class {funcetInformationk(값:문자열?) }
NS 객체 프로토콜:
protocol ViewControllerDelegate : NSObjectProtocol {funcetInformation(값:문자열?) }
언급URL : https://stackoverflow.com/questions/38841127/why-can-the-keyword-weak-only-be-applied-to-class-and-class-bound-protocol-typ
'programing' 카테고리의 다른 글
| jquery ajax 데이터에 [개체 개체]가 표시됩니다. (0) | 2023.08.04 |
|---|---|
| 여러 저장 프로시저의 결과 연합 (0) | 2023.08.04 |
| 이름이나 유형에 특정 언어 연결이 있다는 것은 무엇을 의미합니까? (0) | 2023.07.30 |
| Invoke-WebRequest : '헤더' 매개 변수를 바인딩할 수 없습니다. (0) | 2023.07.30 |
| 파이썬 스크립트를 이진 실행 파일로 컴파일하는 방법 (0) | 2023.07.30 |