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에 따라 라이센스가 부여됩니다.