IT Share you

키워드 "weak"이 클래스 및 클래스 바인딩 된 프로토콜 유형에만 적용될 수있는 이유

shareyou 2020. 11. 15. 12:05
반응형

키워드 "weak"이 클래스 및 클래스 바인딩 된 프로토콜 유형에만 적용될 수있는 이유


weakSwift에서 와 같이 변수를 선언 할 때 가끔 Xcode에서 오류 메시지가 표시됩니다.

'weak'은 클래스 및 클래스 바인딩 프로토콜 유형에만 적용될 수 있습니다.

왜 키워드 weak가 클래스 및 클래스 바운드 프로토콜 유형에만 적용될 수 있는지 궁금 합니다. 그 이유는 무엇입니까?


weak참조 유형에 대한 규정 자입니다 ( structs 및 내장 값 유형과 같은 값 유형과 반대 임).

참조 유형을 사용하면 동일한 객체에 대한 여러 참조를 가질 수 있습니다. 마지막 강력한 참조가 참조를 중지하면 개체의 할당이 해제됩니다 (약한 참조는 계산되지 않음).

반면에 값 유형은 사본으로 지정됩니다. 참조 계수는 적용되지 않으므로 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.


enter image description hereI 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).

참고URL : https://stackoverflow.com/questions/38841127/why-can-the-keyword-weak-only-be-applied-to-class-and-class-bound-protocol-typ

반응형