【Swift】Objective-C의 프로퍼티를 Swift에서 취급할 때의 주의점

Objective-C @property 에서 정의된 속성을 Swift에서 다룰 때 지식 부족으로 조금 실패했기 때문에 조사해 보았습니다.

실수 등이 있으면 지적하십시오

실패 내용


  • Swift에서 Objective-C 속성 ( nullability annotation 없음) 사용
  • Swift에서 implicitly unwrapped optional 형식으로 변환 된 속성을 그대로 사용
  • implicitly unwrapped optional로 변환 된 Objective-C 값이 nil이기 때문에 런타임 오류

  • 결론


  • nullability annotation 를 제대로 사용하여 Swift에서 호출 할 때 implicitly unwrapped optional를 사용하지 마십시오.
  • 상기가 어려운 경우는 nullability annotation를 지정하지 않은 프로퍼티를 Swift에서 사용할 때는 nil 체크를 한다. (조금 기분 나쁘다)

  • nullability annotation을 지정하지 않은 속성을 Swift에서 사용



    nullability annotation이란?


    nullability annotation 는, Objective-C 의 프로퍼티에 붙여지는 nullablenonnull 와 같은 속성이 됩니다. (자세한 내용은 여기)

    nullability annotation이 붙은 프로퍼티를 Swift에서 보면?



    Objective-C 코드에서 nullability annotation가 올바르게 사용되는 경우 Swift에서 해당 속성을 사용하면 어떻게 처리됩니까?

    어쩐지 상상할 수 있을까 생각합니다만,
  • nullable 는 Optional에서 wrap 된 형태
  • nonnull 비 Optional 형

  • 로 Swift에서 처리할 수 있습니다.

    [Objective-C]
    @property (nullable) id nullableProperty;
    @property (nonnull) id nonNullProperty;
    

    [Swift]
    var nullableProperty: AnyObject?
    var nonNullProperty: AnyObject
    

    nullability annotation 이 붙지 않은 프로퍼티를 Swift에서 보면?



    그런 다음 nullability annotation 가 사용되지 않는 속성을 Swift에서 처리할 때 어떻게 될지 살펴보겠습니다.

    [Objective-C]
    @property id unannotatedProperty;
    

    [Swift]
    var unannotatedProperty: AnyObject!
    
    nullability annotation 를 사용하지 않으면 ! 가 붙습니다. 이것은 implicitly unwrapped optional 라고 하는 것입니다.implicitly unwrapped optional 의 실체는 Optional 입니다만, 확실히 값이 들어 있다고 전제로 암묵적으로 unwrap 되어 사용됩니다.

    엔티티는 Optional이므로 nil이 들어 있으면 암시적인 unwrap에서 오류가 발생합니다.

    조심하고 싶은 점



    여기서 Objective-C에서 변환된 implicitly unwrapped optional 의 프로퍼티의 취급에 주의가 필요합니다.implicitly unwrapped optional 그래서 값이 들어있을 것입니다만, 경우에 따라서는 Objective-C의 코드로 nil이 들어가 있다고 하는 것이 일어날 수 있습니다.

    그래서, 통상의 implicitly unwrapped optional 보다 조심해 취급하지 않으면 예기치 않은 런타임 에러에 조우할 가능성이 있습니다.

    결론(재게재)



    만약, Objective-C에서 부른 프로퍼티가 implicitly unwrapped optional 가 되어 있으면 이하와 같이 대응하는 것이 좋을 것 같습니다.
  • nullability annotation 를 제대로 사용하여 Swift에서 호출 할 때 implicitly unwrapped optional를 사용하지 마십시오.
  • 상기가 어려운 경우는 nullability annotation를 지정하지 않은 프로퍼티를 Swift에서 사용할 때는 nil 체크를 한다. (조금 기분 나쁘다)

  • 끝에



    결론에도 쓴 대로, Objective-C측에서 적절하게 nullability annotation 를 사용하는 것으로 Swift와 제휴했을 때에 안전한 코드를 쓸 수 있을 것 같습니다.

    참고


  • https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID45
  • htps : //에서 ゔぇぺぺr. 아 ぇ. 코 m / ぃ b 등 ry / 이오 s / 도쿠 멘 타치 온 / 슈 ft / 콘세 p ㄱ l / 슈 ft_P 로그 라 민 g_ ぁ ぐ あげ / てぇばし cs. HTML # // / p p_re f / c / 우이 d / TP40014097 - CH5 - D334
  • ぇぇぺぺr. 놀고 rp. 네 t/엔 try/bぉg/엔기 네 r/오 bjC_수ㅇft_누구 bぇ/
  • 좋은 웹페이지 즐겨찾기