블록 기반 API 메서드에서 null이 아닌 nullable Objective-C 키워드를 사용하는 방법
다음 방법을 고려하십시오.
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
new nonnull
및 nullable
주석 키워드를 사용하여 다음과 같이 보강 할 수 있습니다.
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
그러나 우리는 또한이 경고를받습니다 :
포인터에 null 허용 여부 유형 지정자 (__nonnull 또는 __nullable)가 없습니다.
세 번째 매개 변수 (블록 1)를 참조합니다.
문서 블록 매개 변수의 Null 허용 여부를 지정하는 방법을 예제와 함께 적용되지 않습니다. 축 어적으로 진술합니다.
형식이 단순 개체 또는 블록 포인터 인 한, 여는 괄호 바로 뒤에 밑줄이없는 형식의 nullable 및 nonnull을 사용할 수 있습니다.
나는 운없이 블록에 대한 두 키워드 중 하나를 (어느 위치 에나) 넣어 보았습니다. 또한 밑줄 접두사 변형 ( __nonnull
및 __nullable
)을 시도했습니다 .
따라서 내 질문은 : 블록 매개 변수에 대한 null 허용 의미를 어떻게 지정할 수 있습니까?
이것은 작동하는 것 같습니다
- (void)methodWithArg:(nonnull NSString *)arg1
andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
(NSArray * _Nullable results, NSError * _Nonnull error))completionHandler
블록과 해당 매개 변수 모두에 대해 null 허용 여부를 지정해야합니다.
편집 : 자세한 내용은 Swift 블로그를 참조하십시오.
에 따르면 애플 블로그 ( "Null 허용 여부 및 목표 - C") , 당신은 사용할 수 있습니다
NS_ASSUME_NONNULL_BEGIN
및 NS_ASSUME_NONNULL_END
.
이러한 영역 내에서 모든 단순 포인터 유형은 nonnull
. 그런 다음 nullable
nullable 개체를 추가 할 수 있습니다.
NS_ASSUME_NONNULL_BEGIN
@interface MyClass: NSObject
- (void)methodWithArg:(NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
@end
NS_ASSUME_NONNULL_END
- 경우 오류가 있다
NSError **
유형이어야NSError * _Nullable * _Nullable
- object가
id *
type이면 더 나은 사용id _Nullable * _Nonnull
, 그것은 당신이 원하는_Nullable id * _Nullable
유형일 수 있습니다 . - 객체가
NSObject *
유형이면 다음과 같이 포인터 뒤에 주석을 넣어야합니다.NSObject * _Nullable * _Nonnull
노트
_Nonnull
및 _Nullable
포인터 후에 사용한다 또는 id
(애플이 예제 코드에서와 AAPLListItem * _Nullable
)하지만, 비 밑줄 형태 nonnull
와는 nullable
여는 괄호 후 사용할 수 있습니다.
당신이 아닌 밑줄 형식을 사용할 수있는 방법을 선언 내에서 그러나, 일반적인 경우에 이러한 주석 작성하는 훨씬 좋네요의 방법이
nullable
와nonnull
한 유형이 단순 객체 또는 블록 포인터로 바로 여는 괄호 후를.
"Nullability and Objective-C" 에서 자세한 내용을 확인하십시오.
안전을 위해이 규칙에는 몇 가지 예외가 있습니다.
typedef
형식에는 일반적으로 고유 한 null 허용 여부가 없습니다. 컨텍스트에 따라 쉽게 nullable 또는 non-nullable이 될 수 있습니다. 따라서 감사 된 지역 내에서도typedef
유형이로 간주되지 않습니다nonnull
.- 보다 복잡한 포인터 유형은
id *
명시 적으로 주석을 달아야합니다. 예를 들어 nullable 개체 참조에 대한 nullable이 아닌 포인터를 지정하려면_Nullable id * _Nonnull
.- 특정 형식
NSError **
은 메서드 매개 변수를 통해 오류를 반환하는 데 자주 사용되므로 항상 nullableNSError
참조에 대한 nullable 포인터로 간주됩니다 .
_Nullable id * _Nonnull
혼동 될 수는 id _Nullable * _Nonnull
더 나은 이해이다.
_Nonnull
및 _Nullable
포인터 후에 사용 또는한다 id
(애플이 예제 코드에서와AAPLListItem * _Nullable
)
다음과 같이 할 수도 있습니다.
- (id __nullable)methodWithArg:(NSString * __nullable)arg1
andArg:(NSString * __nonnull)arg2
completionHandler:(void (^ __nonnull)(NSArray * __nonnull results, NSError * __nullable error))completionHandler;
그것은 당신이 더 좋아하는 구문에 달려 있습니다.
헤더 파일에서 완성을 정의하기 위해 이렇게했습니다.
typedef void (^PublicEventsHandler) (BOOL success, NSArray * _Nullable publicEvents);
물론 받아 들여진 답변에 동의합니다.
Apple 개발자 블로그 : The Core : _Nullable 및 _Nonnull
you can use the non-underscored forms nullable and nonnull immediately after an open parenthesis, as long as the type is a simple object or block pointer.
The non-underscored forms are nicer than the underscored ones, but you’d still need to apply them to every type in your header.
Here is what I have used for the NSError ** case:
-(BOOL) something:(int)number withError:(NSError *__autoreleasing __nullable * __nullable)error;
'Programming' 카테고리의 다른 글
Go의 쌍 / 튜플 데이터 유형 (0) | 2020.08.28 |
---|---|
C # 메서드 매개 변수로 Lambda 식 전달 (0) | 2020.08.28 |
Windows의 Emacs (0) | 2020.08.28 |
svn과 호환되는 Git 형식 패치? (0) | 2020.08.28 |
우선 순위 및 비트 마스크 작업 (0) | 2020.08.28 |