블록 기반 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
'source' 카테고리의 다른 글
HttpRequestValidation을 피하는 방법예외를 발생시킨 동일한 뷰를 렌더링하는 ASP.NET MVC에서 예외 발생 (0) | 2023.05.20 |
---|---|
"\n"과 환경의 차이입니다.새 줄 (0) | 2023.05.20 |
CREATE TABLE 정의에서 인덱스를 생성할 수 있습니까? (0) | 2023.05.20 |
VB 프로젝트를 C# 프로젝트로 변환하는 방법 (0) | 2023.05.20 |
Angular Reactive Forms: 확인란 값 배열을 생성합니까? (0) | 2023.05.20 |