source

블록 기반 API 방법에서 null 및 null이 아닌 Objective-C 키워드를 사용하는 방법

manysource 2023. 5. 20. 10:56

블록 기반 API 방법에서 null 및 null이 아닌 Objective-C 키워드를 사용하는 방법

다음 방법을 고려합니다.

- (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 유형 지정자(__nonnull 또는 __nullable)가 없습니다.

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

설명서에는 블록 매개 변수의 무효성을 지정하는 방법에 대한 예제가 포함되어 있지 않습니다.그것은 말 그대로입니다.

형식이 단순 개체 또는 블록 포인터인 경우 열린 괄호 바로 뒤에 밑줄이 없는 null 및 nonnull 형식을 사용할 수 있습니다.

저는 두 개의 키워드 중 하나를 (어떤 위치에) 넣으려 했지만 실패했습니다.가 붙은했습니다.__nonnull그리고.__nullable).

따라서 제 질문은 블록 매개 변수에 대한 무효성 시맨틱을 어떻게 지정할 수 있는가 하는 것입니다.

이것은 효과가 있는 것 같습니다.

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

블록과 해당 매개 변수 모두에 대해 nullability를 지정해야 합니다...

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

Apple Blog("Nullability and Objective-C")에 따르면 다음을 사용할 수 있습니다.

NS_ASSUME_NONNULL_BEGIN그리고.NS_ASSUME_NONNULL_END.

내에서 단순 은 이한영내에모든단순포인유터형다다같가니이정됩음과은으로 됩니다.nonnull그러면 그냥 추가하시면 됩니다.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 **type,는 형유, 야합니다래이어야 .NSError * _Nullable * _Nullable
  • 가 약만그면다인 id * 유형, 더나사용은id _Nullable * _Nonnull그것은 (아마도 당신이 원할 것입니다._Nullable id * _Nullable타이프)를 누릅니다.
  • 가 약만그면다인 NSObject * 포인터을 붙여야 . 를 들면, 뒤주에석넣을포합어니다렇, 게이타야인.NSObject * _Nullable * _Nonnull

메모

_Nonnull그리고._Nullable 또는 포터뒤사야합니용다해에 뒤에 .id(Apple은 예제 코드에서 수행합니다.AAPLListItem * _Nullable), 형식), nonnull그리고.nullable열린 괄호 뒤에 사용할 수 있습니다.

을 쓰는 더 방법이 가 낮은 형태인 ▁the▁▁use다▁can▁these▁within'▁in니▁method▁declarations:습▁non있을 사용할 수 있습니다. 메소드 선언 내에서 점수가 낮은 형식을 사용할 수 있습니다.nullable그리고.nonnull형식이 단순 개체 또는 블록 포인터인 경우 열린 괄호 바로 뒤에 표시됩니다.

"Nullability and Objective-C"에서 자세히 확인합니다.

안전을 위해 이 규칙에는 몇 가지 예외가 있습니다.

  • typedef유형에는 일반적으로 고유한 null 가능성이 없습니다. 컨텍스트에 따라 쉽게 null 가능하거나 비활성화 불가능할 수 있습니다. 그므로러,typedef유형은 다음과 같이 가정되지 않습니다.nonnull감사 지역 내에서도.
  • 다음과 같은 보다 복잡한 포인터 유형id *명시적으로 주석을 달아야 합니다.예를 들어, nullable 객체 참조에 null이 아닌 포인터를 지정하려면 다음을 사용합니다._Nullable id * _Nonnull.
  • 특정 유형NSError **는 메서드 매개 변수를 통해 오류를 반환하는 데 너무 자주 사용되므로 항상 nullable에 대한 nullable 포인터로 간주됩니다.NSError언급.

_Nullable id * _Nonnull헷갈릴 수도 있지만,id _Nullable * _Nonnull더 잘 이해하는 것이 좋습니다.

_Nonnull 포인터 뒤에 사용해야 합니다. 또는 (Apple은 예제 코드에서 사용합니다.)

다음과 같은 작업도 수행할 수 있습니다.

- (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 개발자 블로그에서:핵심: _Null 및 _Nonnull

형식이 단순 개체 또는 블록 포인터인 경우 열린 괄호 바로 에 null 및 nonnull 형식을 사용할 수 있습니다.

밑줄이 없는 양식이 밑줄이 있는 양식보다 낫지만 헤더의 모든 유형에 적용해야 합니다.

NSError ** 사례에 사용한 내용은 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/29647919/how-to-use-nonnull-and-nullable-objective-c-keywords-in-block-based-api-method