swift 4.0 적합
11947 단어 swift
우리 의 공사 에서
swift 과 OC 을 혼합 한 상태 로 swift 을 사용 한 지 이미 1 년 반 이 되 었 다.Xcode9 의 업데이트 에 따라 swift3.2 과 swift4.0 도 이에 따라 왔 다.swift3.2 은 Xcode8 의 swift3.1 에 비해 변동 이 매우 적 고 적합 에 문제 가 없 으 며 주로 swift4.0 의 적합 에 관심 을 가진다.2.현재 프로젝트 의 swift 버 전 보기
3.Xcode 를 사용 하여 프로젝트 를 swift 4.0 으로 전환 합 니 다.
1.환경
swift 버 전 3.2 target target(pod 참조 체크 하지 않 음),Next swift 의 @objc 추정 특성 에 관 한 것 으로 swift4.0 명시 적 @objc 속성 을 사용 하면 전체 코드 의 크기 를 줄 일 수 있다.이때 우 리 는 Minimize Inference(recommend)를 선택 합 니 다.두 가지 옵션 에 대해 서:3.오류 수정
상기 5 단 계 를 완성 한 후에
swift 버 전 을 보면 4.0 입 니 다.이로써 일 을 마치 고 마침 잘 맞 게 끝났다.하지만 그렇지 않 습 니 다.실행 할 때 이것 을 볼 수 있 습 니 다.
울 고 싶 은 지 눈물 이 없 는 지,이렇게 많은 실 수 를 두려워 하지 마 세 요.사실은 바 꿀 곳 이 많 지 않 습 니 다.어떤 것 은 모두 중복 되 어 있 으 니 직접 전체 국면 으로 바 꿀 수 있 으 면 됩 니 다.
밤 을 들다
//
class dynamic func bookMoneyToUpController() -> MPBookMoneyToUpController {
let vc = MPBookMoneyToUpController.init(nibName: "MPBookMoneyToUpController", bundle: Bundle.main)
return vc
}
//
class @objc dynamic func bookMoneyToUpController() -> MPBookMoneyToUpController {
let vc = MPBookMoneyToUpController.init(nibName: "MPBookMoneyToUpController", bundle: Bundle.main)
return vc
}
// @objc
//
@objc class dynamic func bookMoneyToUpController() -> MPBookMoneyToUpController {
let vc = MPBookMoneyToUpController.init(nibName: "MPBookMoneyToUpController", bundle: Bundle.main)
return vc
}
//
class @objc dynamic func -> @objc class dynamic func
주:위 에
dynamic 장식 부 를 사용 한 것 은 예전 에 JSPatch 을 사용 하여 hotfix 을 만 들 었 기 때문에 원래 OC 의 운행 시 특성 을 사용 해 야 하기 때 문 입 니 다.4.@obbc
swift4.0 의 가장 큰 특성 중 하 나 는 바로 @objc 수정자 의 변화 이다.주로 OC 과 swift 을 혼합 할 때 일부 방법의 호출 과 속성 획득 문 제 를 처리 하고 swift4.0 은 swift3.x 에서 일부 암시 적 유형 으로 추정 되 는 특성 을 제거 한 후에 @objc 수정자 를 수 동 으로 관리 해 야 한다.위의 글 에서 Xcode 변환 swift4.0 을 사용 할 때 우 리 는 Minimize Inference 옵션 을 선택 했다.그러면 우 리 는 관련 @objc 수식 자 를 수 동 으로 처리 하여 OC 과 swift 코드 가 정상적으로 서로 호출 될 수 있 도록 해 야 한다.1.
@objc 수정자 수 동 처리 절차'최소 화'변환 코드 를 사용 한 후 구축 과 운행 시의 문 제 를 처리 해 야 하 며,초기
swift4.0 변환 을 마 친 후 에는 아래 절차 에 따라 다른 문 제 를 처리 해 야 한다.@objc 을 추가 해 야 하 는 곳 @objc 참조 경 고 를 사 용 했 습 니 다.경고 없 이Swift 3 @objc inference 을 Default.2.
@objc 수정자 가 처리 해 야 할 문제#selector 매개 변수 가 지정 한 인 스 턴 스 방법 은 @objc 으로 수식 해 야 합 니 다.swift4 에서 @objc 속성 으로 추정 되 기 때 문 입 니 다.//
class MyClass : NSObject {
func foo() {
}
func bar() {
self.perform(#selector(MyClass.foo)
}
}
warning: argument of ‘#selector’ refers to instance method ‘foo’ in ‘MyClass’ that depends on ‘@objc’ attribute inference deprecated in Swift 4
OC 에서 호출 된 swift 방법 을 경 고 했 고 swift 에 @objc 수식 을 추가 해 야 하 며 swift4 은 이 유형의 추정 을 폐기 했다.//
@implementation MyClass (ObjCMethods)
- (void)other {
[self foo];
}
@end
warning: Swift method MyClass.foo uses @objc inference deprecated in Swift 4; add @objc to provide an Objective-C entrypoint
// @objc
class MyClass : NSObject {
@objc func foo() {
}
func bar() {
self.perform(#selector(MyClass.foo)
}
}
@objc 을 추가 해 야 하 는 모든 컴 파일 경 고 를 보고 해당 위치 로 직접 선택 하여 @objc 수식 을 추가 하면 됩 니 다.***Swift runtime:
ClassName.swift:lineInFile:columnInLine:
entrypoint -[ClassName methodName] generated by implicit @objc inference is deprecated and will be removed in Swift 4;
add explicit @objc to the declaration to emit the Objective-C entrypoint in Swift 4 and suppress this message
Xcode9.1 에서 실 행 될 때 경 고 는 여기 서도 볼 수 있 습 니 다.실행 중 경 고 를 복구 하려 면
@objc 수식 자 를 해당 하 는 방법 이나 기호 에 추가 해 야 합 니 다.OC 에서 SEL swift 에서 perform methods OC 에서 performSelector methods @IBOutlet 또는 @IBAction // swift
class MyClass : NSObject {
func foo() {
}
func bar() {
let selectorName = "foo"
self.perform(Selector(selectorName)
}
}
***Swift runtime: MyClass.swift:7:7: entrypoint -[MyClass foo] generated by implicit @objc inference is deprecated and will be removed in Swift 4; add explicit @objc to the declaration to emit the Objective-C entrypoint in Swift 4 and suppress this message
5.
swift4.0 기타 부분 특성1、NSAttributedStringKey
NSAttributedString 의 초기 화 방법 변화:// swift3.x
public init(string str: String, attributes attrs: [AnyHashable : Any]? = nil)
// swift4.0
public init(string str: String, attributes attrs: [NSAttributedStringKey : Any]? = nil)
예시:
//
let attributes = [NSForegroundColorAttributeName: RGB(128, g: 134, b: 146),
NSParagraphStyleAttributeName: paragraph,
NSFontAttributeName: UIFont.systemFont(ofSize: 14)] as [String : Any]
var tipAttrText = NSAttributedString.init(string: tipText, attributes: attributes)
//
let attributes = [NSAttributedStringKey.foregroundColor.rawValue: RGB(128, g: 134, b: 146),
NSAttributedStringKey.paragraphStyle: paragraph,
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)] as! [String : Any]
var tipAttrText = NSAttributedString(string: tipText, attributes: attributes)
// tipAttrText
Cannot convert value of type '[String : Any]' to expected argument type '[NSAttributedStringKey : Any]?'
//
NSAttributedStringKey.foregroundColor.rawValue -> NSAttributedStringKey.foregroundColor
as! [String : Any]
2、String
String 의 characters 속성 이 폐기 되 었 습 니 다 let string = "abc"
var count = string.characters.count
//
'characters' is deprecated: Please use String or Substring directly
//
count = string.count
String 의 addingPercentEscapes 방법 이 폐기 되 었 습 니 다 // swift3.x
var url = @"http://www.example.com?username= "
url = url.addingPercentEscapes(using: String.Encoding.utf8)!
//
'addingPercentEscapes(using:)' is unavailable: Use addingPercentEncoding(withAllowedCharacters:) instead, which always uses the recommended UTF-8 encoding, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.
//
uri = uri.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
substring(to:) 폐기 되 었 습 니 다 let index = tagText.index(tagText.startIndex, offsetBy: MPMultipleStyleListItemTagMaxLength)
// :'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range upto' operator.
let b = tagText.substring(to: index)
// API
// :a Substring, String
let a = tagText.prefix(upTo: index)
3.초기 화 폐기
// swift3.x
override class func initialize() {
// some code
}
//
Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift
Swift3.x 계속 Method Swizzling 이 글 에서 해결 방향 을 소개 했다.
4.
swift3 은 #selector 이 지정 한 방법 을 사용 하고 방법 권한 이 private 일 때 만 @objc 장식 부 를 추가 하고 swift4.0 은 모두 @objc 장식 부 를 추가 해 야 한다.//
func startMonitor() {
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshUserLoginStatus), name: NSNotification.Name.XSLUserLogin, object: nil)
}
func refreshUserLoginStatus() {
// some code
}
//
Argument of '#selector' refers to instance method 'refreshUserLoginStatus()' in 'MPUnreadMessageCountManager' that depends on '@objc' inference deprecated in Swift 4
// private
func startMonitor() {
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshUserLoginStatus), name: NSNotification.Name.XSLUserLogin, object: nil)
}
private func refreshUserLoginStatus() {
// some code
}
//
Argument of '#selector' refers to instance method 'refreshUserLoginStatus()' that is not exposed to Objective-C
swift4.0 더 이상 extension 의 무 거 운 짐 을 싣 는 방법(instance,static,class 방법 포함)//
class TestSuperClass: NSObject {
}
extension TestSuperClass {
func test() {
// some code
}
}
class TestClass: TestSuperClass {
// :Declarations from extensions cannot be overridden yet
override func test() {
// some code
}
}
인용
다음 내용 을
pod 에 추가 합 니 다.post_install do |installer|
installer.pods_project.targets.each do |target|
if ['WTCarouselFlowLayout', 'XSLRevenue', 'OHHTTPStubs/Swift'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
end
구덩이
Podfile 프로 토 콜 방법 명 변경,오류 알림 없 음:// swift3.x
func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: IndexPath) -> CGFloat
// swift4.0
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백그라운드에서 값을 계산하고 Swift 동시성 이후에 결과 사용값을 계산해야 하고 메인 스레드를 차단하지 않으려면 계산된 값을 반환하는 Swift Task 구조에서 해당 값을 계산하면 됩니다. Swift 동시성 이전에는 백그라운드 대기열로 이동하여 필요한 값을 계산하고 필요한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.