Swift 4 모드에서 Swift 3 @objc 유추는 사용되지 않습니다.


485

간단히 말해 Xcode 9 Beta를 사용하는 동안 다음 경고가 발생합니다.

Swift 4 모드에서 Swift 3 @objc 유추는 더 이상 사용되지 않습니다. 더 이상 사용되지 않는 @objc 유추 경고를 해결하고 "사용되지 않는 Swift 3 @objc 유추 사용"로깅을 사용하여 코드를 테스트하고 Swift 3 @objc 유추를 비활성화하십시오. **

일부 조사 후에도 여전히 문제를 해결하는 방법을 모릅니다. 이 문제를 해결하는 방법에 대한 팁과 진행 상황에 대한 설명을 보내 주셔서 감사합니다.

내 목표는 내 코드로 무슨 일이 일어나고 있는지 더 잘 이해하는 것입니다.


4
어떤 개체가 원인인지 경고 메시지에서 실제로 얻지 못합니다. Xcode는 단순히 그 객체가 어느 줄에 있는지 말하지 않습니다. 이 경고의 출처를 찾는 방법에 대한 조언이 있습니까?
olyv

답변:


816

타겟의 "Swift 3 @objc Inference"빌드 설정을 "Default"로 변경하여이 경고를 제거했습니다.

Xcode9에서 Swift 3 @objc 유추 비활성화

에서 이 문서 :

Swift 4 이전에 컴파일러는 Objective-C에서 일부 Swift 선언을 자동으로 사용할 수 있도록했습니다 . 예를 들어 NSObject에서 서브 클래 싱 된 클래스가있는 경우 컴파일러는 해당 클래스의 모든 메서드에 대한 Objective-C 진입 점을 만들었습니다. 이 메커니즘을 @objc 추론이라고합니다.

Swift 4에서는 이러한 Objective-C 진입 점을 모두 생성하는 데 비용이 많이 들기 때문에 이러한 자동 @objc 유추가 사용되지 않습니다 . "Swift 3 @objc Inference"설정이 "On"으로 설정되면 이전 코드가 작동합니다. 그러나 해결해야 할 사용 중단 경고가 표시됩니다. 이 경고를 "수정" 하고 새 Swift 프로젝트의 기본값 인 "Default"로 설정을 전환하는 것이 좋습니다 .

자세한 내용은 이 Swift 제안 을 참조하십시오.


5
Evgenii 감사합니다. 이것이 장기적인 해결책입니까?
DaleK

6
@DaleK 네, 그렇습니다. 내 대답에서 언급 한 Swift 제안에 따르면 objc 유추는 더 이상 사용되지 않습니다. "Swift 3 objc Inference"설정은 이전 버전의 Swift에서 마이그레이션 된 프로젝트에만 있습니다. 새 프로젝트를 만들면 설정이 더 이상 존재하지 않아 objc 유추가 해제됩니다. objc 유추 경고를 해결하고 "끄기"로 설정하는 것이 좋습니다.
Evgenii 2016

4
XCode의 정보 메시지는 다음과 같이 제안합니다. " @objcSwift 4 모드에서 Swift 3 추론 사용 은 더 이상 사용되지 않습니다. 더 이상 사용되지 않는 @objc추론 경고를 해결 하고"더 이상 사용되지 않는 Swift 3 @objc추론 사용 "로깅을 사용 하여 코드를 테스트 하고 Swift 3 @objc추론을 비활성화하십시오 ." 상기 Swift 3 @objc추론 로깅을 어디서 사용할 수 있는지 아십니까?
courteouselk

4
@courteouselk, Swift 제안에 따르면 SWIFT_DEBUG_IMPLICIT_OBJC_ENTRYPOINT 환경 변수를 1에서 3 사이의 값으로 설정하여 Objective-C 진입 점의 사용법을 로그에서 볼 수 있습니다.
Evgenii 2016 년

14
단지 추가하기-프로젝트뿐만 아니라 모든 빌드 태그에 대해이 작업을 수행해야합니다.
Krivvenz

270

- @objc추론 이란 무엇입니까 ? 무슨 일이야?

에서 Swift 3컴파일러를 추론, @objc여러 곳에서 당신은 필요가 없습니다 것 때문에. 다시 말해, 그것은 @objc당신 을 위해 추가 해야합니다!

에서 Swift 4, 컴파일러는 더 이상 (많이)이하지 않습니다. 이제 @objc명시 적으로 추가해야합니다 .

기본적으로 스위프트 4 이전 프로젝트가있는 경우 이에 대한 경고가 표시됩니다. Swift 4 프로젝트에서는 빌드 오류가 발생합니다. 이것은 SWIFT_SWIFT3_OBJC_INFERENCE빌드 설정을 통해 제어됩니다 . 스위프트 4 이전의 프로젝트에서 이것은로 설정됩니다 On. 이것을 새 프로젝트의 기본 옵션 인 Default(또는 Off) 로 설정하는 것이 좋습니다 .

모든 것을 변환하는 데 약간의 시간이 걸리지 만 Swift 4의 기본값이므로 그렇게 할 가치가 있습니다.

-컴파일러 경고 / 오류를 어떻게 중지합니까?

컴파일러가 불평하지 않도록 코드를 변환하는 방법에는 두 가지가 있습니다.

하나는 @objcObjective-C 런타임에 노출되어야하는 각 함수 또는 변수에서 사용하는 것입니다.

@objc func foo() {

}

다른 하나는 선언 으로 사용 @objcMembers하는 것 Class입니다. 이렇게하면 클래스의 모든 함수와 변수에 자동으로 추가 @objc됩니다 . 이것은 쉬운 방법이지만 비용이들 수 있습니다. 예를 들어 노출 될 필요가없는 기능을 노출시켜 응용 프로그램의 크기를 늘릴 수 있습니다.

@objcMembers class Test {

}

-무엇 @objc이며 왜 필요한가?

새 메소드 나 변수를 Swift 클래스에 도입 @objc하는 경우 Objective-C 런타임에 노출되도록 표시합니다 . 이것은 Swift 클래스를 사용하는 Objective-C 코드가 있거나과 같은 Objective-C 유형 기능을 사용하는 경우 필요합니다 Selectors. 예를 들어 대상 작업 패턴은 다음과 같습니다. button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

왜 모든 것을 표시하지 @objc않습니까?

다음과 같은 것으로 표시되는 부정이 있습니다 @objc.

  • 응용 프로그램 이진 크기 증가
  • 기능 과부하 없음

이것은 매우 높은 수준의 요약이며 내가 쓴 것보다 복잡하다는 점을 명심하십시오. 자세한 내용은 실제 제안서를 읽는 것이 좋습니다.

출처 :


@objc동적 디스패치를 ​​의미하지는 않지만 Swift는 정적 또는 가상 디스패치를 ​​자유롭게 사용할 수 있습니다 (결과적으로 다른 코드를 실행할 수도 있음). dynamic키워드는 동적 파견을 사용하는 스위프트을 강제로 요구된다.
kevin

7
버튼에 액션을 추가하는 다른 방법이 있습니까? 사용이 @objc중단 된 경우 사용해야합니까?
Aznix

5
@ 스테판 예, 변환해야 할 부분이 꽤있을 수 있습니다. 여러 단계로 나눕니다. 남겨 SWIFT_SWIFT3_OBJC_INFERENCE에서 On. Swift 4로 변환하십시오. 그런 다음 내용을 처리하십시오 @objc. 간단하게하려면 기본 규칙을 따르십시오. Swift 클래스가 Objc-C 코드에서 (브리지 헤더를 통해) 사용되는 경우 @objcMembers, 그렇지 않으면 씩 add를 사용하십시오 @objc. Xcode 검색을 사용하여 Swift 클래스가 .m파일 에서 호출되는지 확인 하십시오. 이것은 변환이 비교적 고통스럽지 않게해야합니다.
kgaidis

5
@ DaleK이 답변을 받아 들여야합니다. Swift 3에서와 같이 경고를 억제하고 작업을 수행하는 것은 선택 사항이지만 IMHO가 가장 좋은 방법은 아닙니다. @objcSwift 4의 변경 사항 을 이해 한 다음 프로젝트를 수정하고 동일하게 유지하기로 결정하는 것이 중요합니다.
derpoliuk

2
이 간단한 설명에 감사드립니다
Schmoudi

48

Migrator를가 필요로하는 모든 기능을 식별 할 수없는 @objc 유추 오브젝티브 C가 로 표시 썽크 되지 도움말을 당신이 그들을 발견
되지 않는 방법에 대한 경고 구축 •
썽크 사용되지 않는 실행하는 경우 • 콘솔 메시지를

여기에 이미지 설명을 입력하십시오


1
@objc로 무엇을해야합니까? 그것을 제거? 그대로? 나는 이미 그것을 제거했다. 그리고 나는 그 경고를 얻었으므로 그것을 추가해야합니까? 3 단계에서 그 작업을 수행해야합니까?
Shial

func 직전에 @objc 추가
Hassan Taleb

1
3 단계는 무엇에 관한 것입니까? 설명을 추가 할 수 있습니다 :)
Shial

그리고 내 경우에는이 경고가 표시되지만 코드는 지적되지 않습니다. @objc로 표시된 두 가지 방법이 있으며 필요한 유일한 것 같습니다. 기본값으로 변경했지만 컴파일 중에 경고가 계속 표시됩니다.
Maury Markowitz

12

"Swift 3 @objc Inference"= "Default"설정으로이 경고가 발생했습니다. 그런 다음 목표가 아닌 프로젝트에 맞게 설정되었음을 깨달았습니다. 따라서 경고를 제거하려면 대상에 "기본"설정이 있어야합니다.


프로젝트 설정에서 기본값으로 변경 한 후에도 오류를 해결하기 위해 20 분을 낭비했습니다. 대상에서도 변경해야한다고 정확하게 지적했습니다.
SkrewEverything

8

"ON"대신 "default"로 간단히 전달할 수 있습니다. Apple 논리를 더 준수하는 것 같습니다.

(그러나 사용에 관한 다른 모든 의견 @obj은 유효합니다.)


7

실제로 Swift 3 @objc Inference를 비활성화하면 이러한 경고가 사라집니다. 그러나 미묘한 문제가 발생할 수 있습니다. 예를 들어 KVO는 작동을 멈 춥니 다. 이 코드는 Swift 3에서 완벽하게 작동했습니다.

for (key, value) in jsonDict {
    if self.value(forKey: key) != nil {
        self.setValue(value, forKey: key)
    }
}

Swift 4로 마이그레이션하고 "Swift 3 @objc Inference"를 기본값으로 설정 한 후 프로젝트의 특정 기능이 작동을 멈췄습니다 . 이에 대한 해결책을 찾기 위해 디버깅과 연구가 필요했습니다. 내 최선의 지식에 따르면 다음과 같은 옵션이 있습니다.

  • "Swift 3 @objc Inference"사용 (Swift 3에서 기존 프로젝트를 마이그레이션 한 경우에만 작동) 여기에 이미지 설명을 입력하십시오
  • 영향을받는 메소드 및 특성을 @objc로 표시하십시오. 여기에 이미지 설명을 입력하십시오
  • @objcMembers를 사용하여 전체 클래스에 대해 ObjC 유추를 다시 활성화하십시오. 여기에 이미지 설명을 입력하십시오

@objc 유추를 다시 활성화하면 경고가 표시되지만 가장 빠른 해결책입니다. 이전 Swift 버전에서 마이그레이션 한 프로젝트에서만 사용할 수 있습니다. 다른 두 가지 옵션은 더 지루하며 코드 파기 및 광범위한 테스트가 필요합니다.

참조 https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md


7

나는 가끔 iOS 개발자이지만 (곧 더 나올 것입니다.) 다른 답변의 안내에 따라 설정을 찾을 수 없었습니다 (답변에 표시된 키 체인 항목이 없기 때문에). 클릭하고 찾아야 할 강조 표시된 위치로이 스냅 샷을 추가 할 수 있습니다.

  1. 왼쪽 상단에서 시작
  2. 프로젝트 폴더 아이콘을 선택하십시오
  3. 프로젝트 폴더 아이콘 아래에서 기본 프로젝트 이름을 선택하십시오.
  4. 오른쪽에서 빌드 설정을 선택하십시오.
  5. 대상에서 프로젝트를 선택하십시오.
  6. 매우 아래로 스크롤 (또는 검색 텍스트 상자에서 단어 유추를 검색)

설정 찾기


6

"팟 업데이트"및 / 또는 "플러터 클린"을 시도 할 수 있습니다.

또한 xcode에서이 설정을 설정했습니다.

Objective-C 인터페이스 설정은 다음과 같습니다.

ObjectiveC 인터페이스 설정


2

Swift 3 @objc 유추 Swift 4 모드에서 Swift 3 @objc 유추는 더 이상 사용되지 않습니다. 더 이상 사용되지 않는 @objc 추론 경고를 해결하고 "사용되지 않는 Swift 3 @objc 추론 사용"로깅을 사용하여 코드를 테스트 한 다음 "XMLParsingURL"의 "Swift 3 @objc 추론"빌드 설정을 "기본값"으로 변경하여 추론을 비활성화하십시오. 표적.

에 도착

  1. 첫 번째 단계는 빌드 설정입니다

  2. 설정 유추를 빌드하기 위해 검색

  3. swift 3 @objc 추론 기본값 변경

여기에 이미지 설명을 입력하십시오


1

완료 될 때까지 테스트 대기를 실행하면 빌드 설정, 빌드 설정 유추 검색으로 이동하고 swift 3 @objc Inference를 (Default)로 변경하십시오. 그것이 내가 한 일이며 완벽하게 일한 것입니다.


0

Swift 4 모드에서 Swift 3 @objc 유추는 사용되지 않습니다.

func call @objc 사용

func call(){

foo()

}

@objc func foo() {

}

0

@wisekiddo가 말한 것 외에도 , 특히 다른 환경에서 온 경우 빌드 풍미 (예 : 디버그 및 릴리스)와 project.pbxproj같이 Swift 3 @obj 추론을 기본값으로 설정 하여 파일 의 빌드 설정을 수정할 수도 SWIFT_SWIFT3_OBJC_INFERENCE = Default;있습니다 Xcode 외

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.