Objective-C에서 Swift로의 전환으로 버그하기 쉬운 포인트

4799 단어 iOSSwiftObjective-C
최근에는 Swift2.*→3의 이행으로 매우 고통받고 있는 엔지니어 분도 많을까 생각합니다만, 우선은 Objective-C(이하 obj-c)에서 Swift로의 이행으로 문제가 발생하기 쉬운 포인트를 정리해 보았습니다. 눈치채는 대로 추기하고 싶습니다. 그 밖에 있으면 코멘트도 환영합니다

Optional 관련



의도하지 않은 wrap 된 값을 사용하여 오류



Int가 들어 있다고 생각했는데, optional(10) 와 같이 불필요한 캐릭터 라인이 포함되어 있는 경우가 있습니다. optional로 정의한 값의 경우, unwrap 하지 않는다고 가정한 값이 되지 않고, 무심코 버그를 일으킬 우려가 있습니다.

var badgeCount: Int?
badgeCount = 5
print("\(badgeCount)") // Optional(5)が出力され、警告も出ない

의도하지 않은 nil



obj-c 때는 nil의 값이 들어있었을 경우는 기본적으로 크래쉬는 하지 않고 처리가 속행되고 있었습니다만, Swift의 경우 Xcode가 보완해 주는 대로 unwrap등 하고 있으면, nil이 들어가서 앱이 의도하지 않게 충돌하는 문제가 발생한다고 생각합니다. obj-c 때보다는 어떤 값이 들어가는지 가정해야 할 것 같습니다.

아래의 예에서는, record 클래스의 name 라고 하는 멤버가 nil 을 허가하고 있고, label 에 name 을 세트 하는 타이밍에서 unwrap 하면 에러가 발생한다.

let apiClient = ApiClient()
let response = ApiClient().fetchHogeData()
let record = response.records[0]
label.text = record.name! //エラー発生

유형 제약



obj-c에서는 수치라고 하면, NSInteger/NSUInteger/NSNumber등 종류가 많았다고 생각합니다만, swift의 경우는 기본적으로 Int를 사용하는 것이 많을까 생각합니다. 그러나 두 언어가 섞여 있고 Swift → objc에 전달하는 경우 NNSteger 등에 cast해야합니다. Swift 단체의 경우는 그다지 의식하지 않아도 좋을지도 모릅니다만, 이행 과정등에서는 주의할 필요가 있을 것 같습니다.
let memberID: Int = 50
let objcClass = objcClass() // memberIDというNSUIntegerのメンバ変数を持っているとする
objcClass.memberID = UInt(memberID) // memberIDをそのまま渡すとエラーになるのでUIntでキャストする必要がある

obj-c에서 Swift 클래스를 사용할 때의 제약



obj-c에서 swift 클래스를 사용하는 경우 swift 클래스가 NSObject를 상속해야합니다.

module import에서의 버그




지금까지 cocoapods와 같은 라이브러리를 사용하는 경우 특정 .h 파일을 import했다고 생각하지만 swift에서 모듈 지정으로 import하게됩니다. 그러나 위와 같이 import의 후보에 표시되지만, 상쇄선이 나오고 있기 때문에 사용할 수 있을까 생각하고, 특히 문제 없게 사용할 수 버립니다. 아래의 기사에 의하면 Xcode의 버그가 아닌가라고 코멘트되고 있습니다만, 왠지 기분이 나쁘네요. .
h tp : / / s t c ゔ rf ぉ w. 코 m / 쿠에 s Chion s / 36463653 / U-T-S-Te-s-d-d-ne-th-roh-h-x-x-me-m-rt

요약



Swift가 되어 여러가지 깔끔하게 기술할 수 있게 된 반면, obj-c 때와 비교하면 형에 관해서는 엄격하게 되었습니다. 특히 Xcode의 표시되는 unwrap 관련 경고를 별로 이해하지 않고 "?"나 "!"를 붙여 진행하고 있지 않습니까? 특히 obj-c와 swift가 혼재해 버리는 코드의 경우, 아무래도 Optional 속성을 잘 사용하면서 구현을 할 필요가 있습니다. 제대로 이해한 다음 적절한 속성을 사용하여 코드를 작성하지 않으면 나중에 아픈 눈에 띈다. 조심하세요.

참고



어디보다 알기 쉬운 Swift의 "?"와 "!"
Swift3의 IUO(!)형에서 속성으로의 변경에 생각하게 된 것

좋은 웹페이지 즐겨찾기