objective-c - parameter - objective c optional property




블록 기반 API 메소드에서 널이 아닌 널 입력 가능 Objective-C 키워드를 사용하는 방법 (4)

다음과 같이 할 수도 있습니다 :

- (id __nullable)methodWithArg:(NSString * __nullable)arg1
                        andArg:(NSString * __nonnull)arg2
             completionHandler:(void (^ __nonnull)(NSArray * __nonnull results, NSError * __nullable error))completionHandler;

더 좋아하는 구문에만 의존합니다.

다음 방법을 고려하십시오

- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

nonnull nullable 새로운 주석 키워드를 사용하여 다음과 같이 보강 할 수 있습니다.

- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

그러나 우리는 또한이 경고를받습니다 :

포인터에 널 입력 가능 유형 지정자가 없습니다 (__null 또는 __nullable).

세 번째 매개 변수 (블록 1)를 나타냅니다.

설명서 에는 블록 매개 변수의 Null 허용 여부를 지정하는 방법에 대한 예제가 포함되어 있지 않습니다. 말 그대로

유형이 단순한 객체 또는 블록 포인터 인 경우, 괄호 바로 뒤에는 밑줄이없는 양식에서 널 입력 가능 및 널이 아닌 양식을 사용할 수 있습니다.

나는 블록에 대한 두 키워드 중 하나를 아무 위치 에나 놓아 두려고 시도했습니다. 밑줄 접두어 변형 ( __nonnull__nullable )도 시도했습니다.

따라서 내 질문은 : 블록 매개 변수에 null 허용 의미를 어떻게 지정할 수 있습니까?


다음은 NSError ** 사례에 사용한 것입니다.

-(BOOL) something:(int)number withError:(NSError *__autoreleasing  __nullable * __nullable)error;

이것은 작동하는 것 같습니다

- (void)methodWithArg:(nonnull NSString *)arg1 
  andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
  (NSArray * _Nullable results, NSError * _Nonnull error))completionHandler

블록과 해당 매개 변수 모두에 대해 null 허용 여부를 지정해야합니다.

편집 : 자세한 내용은 Swift Blog를 참조하십시오.


헤더 파일에서 완성을 정의하기 위해이 작업을 수행했습니다.

typedef void (^PublicEventsHandler) (BOOL success, NSArray * _Nullable publicEvents);

물론, 나는 대답에 동의합니다.







nullable