Xcode 9에서 "이 함수 선언은 프로토 타입이 아닙니다."경고


119

Xcode 9를 사용할 때 This function declaration is not a prototype. void이를 해결할 메서드 본문 에 추가 할 것을 제안 합니다. 내가 겪고있는 문제는 이러한 경고가 UIApplication위임 방법 과 같은 시스템 API에 대해서도 발생한다는 것입니다 .

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)())completionHandler

이 문제는 다음과 같이 해결할 수 있습니다.

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)(void))completionHandler

이제 위임 메서드가 장기적으로 계속 작동하는지 아니면 Apple이 void이후 iOS 11 베타 버전에 삽입 할 것인지 궁금합니다 . void본문을 포함하면 Xcode가 불일치하는 메서드 선택자에 대해 불평 할 것이기 때문에 궁금 합니다. 누군가 지금까지 같은 문제를 경험 했습니까?

답변:


251

빈 괄호가있는 블록 선언 :

void (^)()

빈 괄호가있는 함수 포인터와 동일한 의미를 갖습니다.

void (*)()

논쟁이 없다는 뜻은 아닙니다. 이는 인수가 지정되지 않았 음을 의미하므로 다음과 같은 방법으로 호출 할 수 있으므로 버그에 대한 길을 엽니 다.

void (^block)() = ...
block();
block(10);
block(@"myString");

매개 변수가없는 블록을 선언 할 때는 항상 다음을 사용하십시오.

void (^)(void)

Apple은 모든 곳에서 올바르게 수행하지 않았으며 호환성 이유로 인해 이전 API에 대해 수정하지 않았을 것입니다. 최신 API로 이동할 때까지 해당 경고를 계속 유지해야합니다.

해당 경고 ( -Wstrict-prototypes)를 끌 수도 있습니다 . 여기에 이미지 설명 입력

또는 사용 #pragma( @davidisdk 감사 합니다 ) :

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"

- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
   withResponseInfo:(NSDictionary *)responseInfo
  completionHandler:(void (^)())completionHandler {

}
#pragma clang diagnostic pop

여기 에서 LLVM 토론 또는 openradar 의 버그를 참조하십시오 .

API의 내부 작업에는 변경 사항이 없으며 모든 코드는 계속 작동합니다. 우리는 API가 그다지 좋지 않다는 것만 알게 될 것입니다.


5
또한 pragma를 사용하여 iOS API를 구현할 때 경고를 제거 할 수 있습니다. #pragma clang diagnostic push #pragma clang diagnostic ignore "-Wstrict-prototypes"-(void) application : (UIApplication *) application handleActionWithIdentifier : (NSString *) identifier forRemoteNotification : (있는 NSDictionary *) 사용자 정보 withResponseInfo : (NSDictionary와 *) responseInfo completionHandler : (무효 (^) ()) completionHandler {의 #pragma 연타 진단 팝
davidisdk

1
JBChartView API에서 약 20 개의 경고를 받았습니다. 스위프트 4로 업데이트하기로 결정할 때까지 끌 수 있다는 것은 좋은
Edison

7
@tymac 이것은 objc 경고입니다. Swift와는 아무 관련이 없습니다.
Sulthan

> "매개 변수가없는 블록을 선언 할 때는 항상 (void)를 사용하십시오."<코드에서 어떻게 보일지 추가 할 수 있습니까? 에 대한 대안으로서 void (^)()또는void (*)()
pkamb

2
@pkamb 블록이 매개 변수 (예 :)를 사용하지 않는 경우 괄호 안에 void(^)()명시 적으로 포함 합니다.. voidvoid(^)(void)
Ben Stock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.