포인터에 null 허용 여부 유형 지정자가 없습니다.
Xcode 7 GM에서는이 경고를 받기 시작했습니다.
포인터에 null 허용 여부 유형 지정자 (_Nonnull, _Nullable 또는 _Null_unspecified)가 없습니다.
다음 함수 선언에서 (NSUserDefaults 확장)
- (void)setObject:(nullable id)value
forKey:(NSString *)defaultName
objectChanged:(void(^)(NSUserDefaults *userDefaults, id value))changeHandler
objectRamains:(void(^)(NSUserDefaults *userDefaults, id value))remainHandler;
이 경고가 표시되는 이유는 무엇이며 어떻게 해결해야합니까?
nullable
핸들러 / 블록도 지정해야합니다.
- (void)setObject:(nullable id)value
forKey:(nonnull NSString *)defaultName
objectChanged:(nullable void(^)(NSUserDefaults *userDefaults, id value))changeHandler
objectRamains:(nullable void(^)(NSUserDefaults *userDefaults, id value))remainHandler;
왜? Swift 때문입니다. Swift는 Objective-C가 허용하지 않는 선택적 매개 변수 (?)를 허용합니다. 이는 Swift 컴파일러가 이러한 매개 변수가 선택 사항임을 알 수 있도록 두 가지를 연결하는 다리 역할을합니다. 'Nonnull'은 인수가 필수임을 Swift 컴파일러에 알립니다. 선택적 nullable
자세한 정보는 https://developer.apple.com/swift/blog/?id=25를 참조하십시오.
목적 c 헤더에서 선언 블록 (함수 및 변수) 주위에 다음 매크로를 사용할 수 있습니다.
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
그런 다음 해당 블록 내에서 nil이 될 수있는 참조에 대해 nullable 주석을 추가해야합니다. 이것은 함수 매개 변수와 변수 선언 모두에 적용됩니다.
에서와 같이 :
@interface SMLBaseUserDetailsVC : UIViewController < UICollectionViewDelegate>
NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) IBOutlet UIScrollView *detailsScrollView;
@property (nonatomic, readonly) IBOutlet UICollectionView *photoCV;
@property (nonatomic, weak, readonly) SMLUser *user;
- (IBAction)flagUser:(id)sender;
- (IBAction)closeAction:(nullable id)sender;
- (void) prefetchPhotos;
NS_ASSUME_NONNULL_END
@end
편집 * 왜 ??? Objective-c 클래스가 swift와 상호 운용 될 수 있으려면 컴파일러가 속성을 신속한 옵션으로 처리할지 여부를 알 수 있도록 null 허용 여부를 선언해야하기 때문입니다. nullable 객관적인 c 속성은 swift에서 선택 사항으로 알려져 있으며 속성에 대한 nullable 선언자와 함께 이러한 매크로를 사용하면 컴파일러가이를 선택 사항으로 처리 할 수 있습니다 (선택 사항은 모나드-객체 또는 nil을 래핑하는 객체).
컴파일러에서 허용하는 올바른 작동 메서드 선언 :
- (void)setObject:(nullable id)value
forKey:(nonnull NSString *)defaultName
objectChanged:(nullable void(^)(NSUserDefaults *_Nonnull userDefaults, id _Nullable value))changeHandler
objectRamains:(nullable void(^)(NSUserDefaults *_Nonnull userDefaults, id _Nullable value))remainHandler;
I post this answer to tell why should add _Nonnull
or nullable
.
According to this blog: https://developer.apple.com/swift/blog/?id=25
One of the great things about Swift is that it transparently interoperates with Objective-C code, both existing frameworks written in Objective-C and code in your app. However, in Swift there’s a strong distinction between optional and non-optional references, e.g.
NSView
vs.NSView?
, while Objective-C represents boths of these two types asNSView *
. Because the Swift compiler can’t be sure whether a particularNSView *
is optional or not, the type is brought into Swift as an implicitly unwrapped optional,NSView!
.
it's all for Swift.
To disable this warning across your entire project
Go to Build Settings
Make sure you are viewing the "All" tab not "Basic" or "Customized"
Search for the field
Other Warning Flags
Add the following flag:
-Wno-nullability-completeness
.Now clean and build (cmd+shift+k then cmd+r)
Quit xCode and Re-open (Don't skip this step!)
--note, it can take a few seconds for the warnings to go away even after you finish building and relaunching xCode, for me it takes about 15 seconds for xCode to fully update
Remove below macro from your .h file and warning will disappear
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
참고URL : https://stackoverflow.com/questions/32539285/pointer-is-missing-a-nullability-type-specifier
'programing' 카테고리의 다른 글
UIPageViewController 내의 슬라이딩 페이지 위에 UIPageControl 요소를 배치하는 방법은 무엇입니까? (0) | 2020.12.07 |
---|---|
Oracle 데이터베이스의 모든 시퀀스를 어떻게 얻을 수 있습니까? (0) | 2020.12.07 |
신 대 모닛 (0) | 2020.12.07 |
Google 코드 + SVN 또는 GitHub + Git (0) | 2020.12.07 |
JavaScript에서 서로 다른 염기간에 숫자를 어떻게 변환합니까? (0) | 2020.12.07 |