Swift 4 모드에서 Swift 3 @objc 유추는 사용되지 않습니다.
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
.
- 응용 프로그램 이진 크기 증가
- 기능 과부하 없음
이것은 매우 높은 수준의 요약이며 내가 쓴 것보다 더 복잡하다는 점을 명심하십시오. 자세한 내용은 실제 제안서를 읽는 것이 좋습니다.
출처 :
- https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
- https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html#//apple_ref/doc/uid/TP40014216-CH5-ID86
Migrator를가 필요로하는 모든 기능을 식별 할 수없는 @objc 유추 오브젝티브 C가 로 표시 썽크 되지 도움말을 당신이 그들을 발견
되지 않는 방법에 대한 경고 구축 •
썽크 사용되지 않는 실행하는 경우 • 콘솔 메시지를
"Swift 3 @objc Inference"= "Default"설정으로이 경고가 발생했습니다. 그런 다음 목표가 아닌 프로젝트에 맞게 설정되었음을 깨달았습니다. 따라서 경고를 없애려면 대상에 "기본"설정이 있어야합니다.
You can simply pass to "default" instead of "ON". Seems more adherent to Apple logic.
(but all the other comments about the use of @obj
remains valid.)
Indeed, you'll get rid of those warnings by disabling Swift 3 @objc Inference. However, subtle issues may pop up. For example, KVO will stop working. This code worked perfectly under Swift 3:
for (key, value) in jsonDict {
if self.value(forKey: key) != nil {
self.setValue(value, forKey: key)
}
}
After migrating to Swift 4, and setting "Swift 3 @objc Inference" to default, certain features of my project stopped working. It took me some debugging and research to find a solution for this. According to my best knowledge, here are the options:
- Enable "Swift 3 @objc Inference" (only works if you migrated an existing project from Swift 3)
- Mark the affected methods and properties as @objc
- Re-enable ObjC inference for the entire class using @objcMembers
Re-enabling @objc inference leaves you with the warnings, but it's the quickest solution. Note that it's only available for projects migrated from an earlier Swift version. The other two options are more tedious and require some code-digging and extensive testing.
See also https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
I'm an occasional iOS dev (soon to be more) but I still couldn't find the setting as guided by the other answer (since I did not have that Keychain item the answer shows), so now that I found it I thought I might just add this snapshot with the highlighted locations that you will need to click and find.
- Start in the upper left
- Choose the project folder icon
- Choose your main project name below the project folder icon.
- Choose Build Settings on the right side.
- Choose your project under TARGETS.
- Scroll very far down (or search for the word inference in search text box)
You can try to "Pod update" and/or "flutter clean"
I also set this setting in xcode.
The Objective-C interface setting is as follows:
Swift 3 @objc Inference The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "XMLParsingURL" target.
got to the
First step got Build Setting
Search in to Build Setting Inference
change swift 3 @objc Inference Default
The use of Swift 3 @objc inference in Swift 4 mode is deprecated?
use func call @objc
func call(){
foo()
}
@objc func foo() {
}
All you need just run a test wait till finish, after that go to Build Setting, Search in to Build Setting Inference, change swift 3 @objc Inference to (Default). that's all what i did and worked perfect.
On top of what @wisekiddo said, you can also modify your build settings in the project.pbxproj
file by setting the Swift 3 @obj Inference to default like SWIFT_SWIFT3_OBJC_INFERENCE = Default;
for your build flavors (i.e. debug and release), especially if you're coming from some other environment besides Xcode
'Programing' 카테고리의 다른 글
vim에서 어떻게 매치를 욕심없이 만들 수 있습니까? (0) | 2020.02.15 |
---|---|
mysql2 설치 오류 : gem 기본 확장을 빌드하지 못했습니다 (0) | 2020.02.15 |
버튼과 링크에서 Firefox의 점선을 제거하는 방법은 무엇입니까? (0) | 2020.02.15 |
명시 적 약속 건설 반 패턴은 무엇이며 어떻게 방지합니까? (0) | 2020.02.15 |
Java Swing에서 set (Preferred | Maximum | Minimum) Size 메서드를 사용하지 않아야합니까? (0) | 2020.02.15 |