키워드 "weak"을 클래스 및 클래스 바인딩 프로토콜 유형에만 적용할 수 있는 이유는 무엇입니까?
변를다음같이선언으로 할 때weak
Swift에서는 가끔 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자).struct
s 및 기본 제공 값 유형).
참조 유형을 사용하면 동일한 개체에 대한 참조를 여러 개 가질 수 있습니다.마지막 강한 참조가 개체 참조를 중지하면 개체의 할당이 취소됩니다(약한 참조는 카운트되지 않음).
그러나 값 유형은 복사본별로 할당됩니다.참조 카운트가 적용되지 않으므로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 |