간단히 말해 Xcode 9 Beta를 사용하는 동안 다음 경고가 발생합니다.
Swift 4 모드에서 Swift 3 @objc 유추는 더 이상 사용되지 않습니다. 더 이상 사용되지 않는 @objc 유추 경고를 해결하고 “사용되지 않는 Swift 3 @objc 유추 사용”로깅을 사용하여 코드를 테스트하고 Swift 3 @objc 유추를 비활성화하십시오. **
일부 조사 후에도 여전히 문제를 해결하는 방법을 모릅니다. 이 문제를 해결하는 방법에 대한 팁과 진행 상황에 대한 설명을 보내 주셔서 감사합니다.
내 목표는 내 코드로 무슨 일이 일어나고 있는지 더 잘 이해하는 것입니다.
답변
타겟의 “Swift 3 @objc Inference”빌드 설정을 “Default”로 변경하여이 경고를 제거했습니다.
에서 이 문서 :
Swift 4 이전에 컴파일러는 Objective-C에서 일부 Swift 선언을 자동으로 사용할 수 있도록했습니다 . 예를 들어 NSObject에서 서브 클래 싱 된 클래스가있는 경우 컴파일러는 해당 클래스의 모든 메서드에 대한 Objective-C 진입 점을 만들었습니다. 이 메커니즘을 @objc 추론이라고합니다.
Swift 4에서는 이러한 Objective-C 진입 점을 모두 생성하는 데 비용이 많이 들기 때문에 이러한 자동 @objc 유추가 사용되지 않습니다 . “Swift 3 @objc Inference”설정이 “On”으로 설정되면 이전 코드가 작동합니다. 그러나 해결해야 할 사용 중단 경고가 표시됩니다. 이 경고를 “수정” 하고 새 Swift 프로젝트의 기본값 인 “Default”로 설정을 전환하는 것이 좋습니다 .
자세한 내용은 이 Swift 제안 을 참조하십시오.
답변
– @objc
추론 이란 무엇입니까 ? 무슨 일이야?
에서 Swift 3
컴파일러를 추론, @objc
여러 곳에서 당신은 필요가 없습니다 것 때문에. 다시 말해, 그것은 @objc
당신 을 위해 추가 해야합니다!
에서 Swift 4
, 컴파일러는 더 이상 (많이)이하지 않습니다. 이제 @objc
명시 적으로 추가해야합니다 .
기본적으로 스위프트 4 이전 프로젝트가있는 경우 이에 대한 경고가 표시됩니다. Swift 4 프로젝트에서는 빌드 오류가 발생합니다. 이것은 SWIFT_SWIFT3_OBJC_INFERENCE
빌드 설정을 통해 제어됩니다 . 스위프트 4 이전의 프로젝트에서 이것은로 설정됩니다 On
. 이것을 새 프로젝트의 기본 옵션 인 Default
(또는 Off
) 로 설정하는 것이 좋습니다 .
모든 것을 변환하는 데 약간의 시간이 걸리지 만 Swift 4의 기본값이므로 그렇게 할 가치가 있습니다.
-컴파일러 경고 / 오류를 어떻게 중지합니까?
컴파일러가 불평하지 않도록 코드를 변환하는 방법에는 두 가지가 있습니다.
하나는 @objc
Objective-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
.
- 응용 프로그램 이진 크기 증가
- 기능 과부하 없음
이것은 매우 높은 수준의 요약이며 내가 쓴 것보다 복잡하다는 점을 명심하십시오. 자세한 내용은 실제 제안서를 읽는 것이 좋습니다.
출처 :
답변
Migrator를가 필요로하는 모든 기능을 식별 할 수없는 @objc
유추 오브젝티브 C가 로 표시 썽크 되지 도움말을 당신이 그들을 발견
되지 않는 방법에 대한 경고 구축 •
썽크 사용되지 않는 실행하는 경우 • 콘솔 메시지를
답변
“Swift 3 @objc Inference”= “Default”설정으로이 경고가 발생했습니다. 그런 다음 목표가 아닌 프로젝트에 맞게 설정되었음을 깨달았습니다. 따라서 경고를 제거하려면 대상에 “기본”설정이 있어야합니다.
답변
“ON”대신 “default”로 간단히 전달할 수 있습니다. Apple 논리를 더 준수하는 것 같습니다.
(그러나 사용에 관한 다른 모든 의견 @obj
은 유효합니다.)
답변
실제로 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