-
(iOS 16.0 +) Swift -> Objective - C 브릿징 간 생긴 일 by NSCFString/iOS 📱 2023. 5. 7. 17:39반응형
안녕하세요 아렉스입니다 !
Swift의 문자열을 Objectvice - C 코드에서 브릿징해서 사용하는 경우는 흔하지않을까 싶어요!그 경우에 관련되어서
iOS 개발자로 취업한 후 첫 메이저 업데이트 iOS 16 를 겪으면서 생긴 일을 공유하고싶어서 글을 써요 ! (2022년 10월 즈음 ..)
(글에 나오는 버그가 확인 된 버전은 iOS 16.0, 16.1, 16.2입니다.)iOS 16.4에서는 픽스되었더라구요 ! (진작 블로그 썻어야했는데 ...)
자 그럼 공유 시작할게요 !!
아래와 같은 문자열의 배열이 있습니다
private var tableViewDataSource: [String] = [ "Notices".localized, "Events".localized, "Helps".localized, ]
Swift에서는 tileString을 Objective-C로 된 UIViewController 의 메소드를 호출을 하여 전달해줍니다
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc: UIViewController = NoticesViewController() let titleString: String = tableViewDataSource[indexPath.row] NoticesViewController().setLocalizedTitle(titleString) self.present(vc, animated: true) }
setLocalizedTitle 메소드의 구현은 이러합니다 !
- (void) setLocalizedTitle:(NSString*)localizedTitle { NSLog(@"%@", localizedTitle); if ( [localizedTitle isEqualToString:NSLocalizedString(@"Notices", nil)]) { NSLog(@"Equal"); } else { NSLog(@"Not Equal"); } }
Swift에서 "Notices".localized 넘겨주었을 때 setLocalizedTitle 메소드의 if문에서 어떤 조건문에 해당될 것 같나요 ?
제가 알고있는 if 문법 내용으로는 Equal이라는 Log를 기대하고있었어요 !! 기존 동작 또한 그랬거든요 :)앗 ..! 이런 결과가 나왔어요
위에서 iOS 16.4에서는 픽스되었다고 했었잖아요 ?
한번 확인해볼까요 ?
동일한 소스의 로직이지만 iOS 버전에 따라서 결과가 잘못나왔어요 .. ㅜㅜㅜ
픽스 되지않은 다른 iOS 16에서 해결하기위해서 Github, 스택오버플로우 다 돌아다녔지만 ,,,
그 당시 검색력으로는 명확한 답을 구하기 어려웠어요 ..!실무인 상용에서 화면이동이 되지않는 크리티컬한 버그였기에 어떻게든 해결해야만했기에
버그가 없던 iOS 15, iOS 16을 비교해가면서 디버깅을 했었어요이러한 디버깅 경험을 가지면서 내린 결론은
NSCFString -> NSString의 서브클래스이며, NSString 또는 CFString으로 캐스팅 해주는 역할인데 이 부분에서 버그가 낫다고 가정을하고 시도를해봤어요
Swift의 타입추론을 사용하지않기 위해서는
타입을 명시적으로 적는 방법을 실험해봤어요 (이렇게 간단하려나 .. ? 라는 의심 90%로 했었어요 ㅋㅋㅋ)// 위에서 보여드린 코드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc: UIViewController = NoticesViewController() let titleString: String = tableViewDataSource[indexPath.row] NoticesViewController().setLocalizedTitle(titleString) self.present(vc, animated: true) } // 묵시적인 타입 선언을 피하고 명시적인 타입 전달하는 코드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc: UIViewController = NoticesViewController() let convertedString: NSString = NSString(string: tableViewDataSource[indexPath.row]) NoticesViewController().setLocalizedTitle(convertedString as String) self.present(vc, animated: true) }
문제가 있던 버전에서도 기대한 Equal 을 받게되었어요 !
그래서 제가 의심한 부분이 맞는지 ,, 문서를 기준으로 필수로 검증했어야하는데
너무 길어질거 같아서 다음 포스팅에 담으려고해요 !
저와 비슷한 경험을 하신 분 & 틀린 부분이 있다면 언제든지 코멘트 부탁드려요 !Reference
개발자 소들이 - ARC와 Toll-free Bridging
https://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/
' > iOS 📱' 카테고리의 다른 글
[iOS] 스토리보드 없이 개발하기 (0) 2023.08.07 [iOS] App Vesion 표시 하고싶을 때 (CFBundleShortVersionString, CFBundleVersion) (0) 2023.05.13 [iOS] UITableView 사용해보기 - 2 (didSelectRowAt with Selection) (0) 2023.01.30 [iOS] UITableView (테이블뷰) 사용해보기 (0) 2022.12.27 [iOS] SF Symbol 사용하기 (0) 2022.11.28