키워드 "weak"이 클래스 및 클래스 바인딩 된 프로토콜 유형에만 적용될 수있는 이유
weak
Swift에서 와 같이 변수를 선언 할 때 가끔 Xcode에서 오류 메시지가 표시됩니다.
'weak'은 클래스 및 클래스 바인딩 프로토콜 유형에만 적용될 수 있습니다.
왜 키워드 weak
가 클래스 및 클래스 바운드 프로토콜 유형에만 적용될 수 있는지 궁금 합니다. 그 이유는 무엇입니까?
weak
참조 유형에 대한 규정 자입니다 ( struct
s 및 내장 값 유형과 같은 값 유형과 반대 임).
참조 유형을 사용하면 동일한 객체에 대한 여러 참조를 가질 수 있습니다. 마지막 강력한 참조가 참조를 중지하면 개체의 할당이 해제됩니다 (약한 참조는 계산되지 않음).
반면에 값 유형은 사본으로 지정됩니다. 참조 계수는 적용되지 않으므로 weak
수정자는 의미가 없습니다.
이 오류의 일반적인 이유 중 하나는 자신의 프로토콜을 선언했지만 NSObjectProtocol에서 상속하는 것을 잊었 기 때문입니다.
protocol PenguinDelegate: NSObjectProtocol {
func userDidTapThePenguin()
}
class MyViewController: UIViewController {
weak var delegate: PenguinDelegate?
}
위의 코드는에서 상속하는 것을 잊은 경우 오류를 제공합니다 NSObjectProtocol
. 그 이유는 weak
참조 유형 (클래스)에만 의미 가 있기 때문입니다 . 따라서 PenguinDelegate가 값 유형이 아닌 클래스를위한 것임을 명확하게 명시하여 컴파일러의 긴장을 덜어줍니다.
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 MyVC: UIViewController {
var myText: UITextView = {
[weak self]
let text = UITextView()
// some codes using self
return text
}()
}
Here an UITextView
object is returned from an anonymous block as initialization of var myText
. I got the same type of error message. To resolve the issue, the var
has to be marked as lazy
:
class MyVC: UIViewController {
lasy var myText: UITextView = {
[weak self]
let text = UITextView()
// some codes using self
return text
}()
}
weak
is for ARC(Automatic Reference Counting). It means not adding reference count. So it only works for Class
. And in Swift, you will get optional value for security.
I tried to capture String and Array-typed properties for a closure. I got these errors:
'weak' may only be applied to class and class-bound protocol types, not '[String]'
'weak' may only be applied to class and class-bound protocol types, not 'String'
I played a while in the playground, and it turned out, capturing self is enough for these types.
I was using objective C class in swift for a scrolView. I created IBOutlet of that scroll view. And while compiling code this error started showing.
So to fix this kind of issue, import that class in your bridging header
import "YourClass.h"
I was using Xcode 9.2 with swift 3.2
Just FYI and who is not updated. After swift proposal SE-0156 https://github.com/apple/swift-evolution/blob/master/proposals/0156-subclass-existentials.md was implemented, there is in the Swift docs "Class-Only Protocols section" https://docs.swift.org/swift-book/LanguageGuide/Protocols.html now described to use AnyObject instead of class. So, it is possible for : class to be deprecated in future.
weak
only works for reference type, so Xcode would report an error if you are calling from struct
(instead of class
).
'IT Share you' 카테고리의 다른 글
"토스트"는 무엇을 의미합니까? (0) | 2020.11.16 |
---|---|
UnicodeEncodeError : 'ascii'코덱은 특수 이름의 문자를 인코딩 할 수 없습니다. (0) | 2020.11.15 |
입력 그룹-서로 가까운 두 개의 입력 (0) | 2020.11.15 |
Eclipse (Helios)에서 Project Lombok이 작동하도록 할 수 없음 (0) | 2020.11.15 |
Ruby 배열에서 중복 요소를 계산하는 방법 (0) | 2020.11.15 |