swift 4.0 적합

11947 단어 swift
글 목록
  • 1.머리말
  • 2.현재 프로젝트 의 swift 버 전
  • 보기
  • 3.Xcode 를 사용 하여 프로젝트 를 swift 4.0
  • 으로 전환 합 니 다.
  • 1,환경
  • 2.전환 절차
  • 3.수정 오류
  • 4,@object
  • 1,`@obj c`수정자 수 동 처리 절차
  • 2,`@obbc`수정자 처리 해 야 할 문제
  • 5.'swift 4.0'기타 부분 특성
  • 1、NSAttributedStringKey
  • 2、String
  • 3,initialize 폐기
  • 4,'swift 3'는'\#selector'가 지정 한 방법 을 사용 합 니 다.방법 권한 이'private'일 때 만'@object'수식 부 를 추가 해 야 합 니 다.'swift 4.0'은 모두'@object'수식 부 를 추가 해 야 합 니 다.
  • 6.`pod`인용
  • 7.구덩이 밟 기
  • 머리말
    우리 의 공사 에서 swiftOC 을 혼합 한 상태 로 swift 을 사용 한 지 이미 1 년 반 이 되 었 다.Xcode9 의 업데이트 에 따라 swift3.2swift4.0 도 이에 따라 왔 다.swift3.2Xcode8swift3.1 에 비해 변동 이 매우 적 고 적합 에 문제 가 없 으 며 주로 swift4.0 의 적합 에 관심 을 가진다.
    2.현재 프로젝트 의 swift 버 전 보기
    3.Xcode 를 사용 하여 프로젝트 를 swift 4.0 으로 전환 합 니 다.
    1.환경
  • Xcode9.1
  • 현재 swift 버 전 3.2
  • 2.전환 절차
  • 에서 전환 할 target
  • 을 선택 하 였 습 니 다.
  • Edit -> Convert -> To Current Swift Syntax
  • 체크 전환 이 필요 한 target(pod 참조 체크 하지 않 음),Next
  • 변환 옵션 을 선택 하고 Next 두 옵션 은 swift@objc 추정 특성 에 관 한 것 으로 swift4.0 명시 적 @objc 속성 을 사용 하면 전체 코드 의 크기 를 줄 일 수 있다.이때 우 리 는 Minimize Inference(recommend)를 선택 합 니 다.두 가지 옵션 에 대해 서:
  • Minimize Inference(recommend)는 정적 추정 에 따라 필요 한 곳 에 만@obbc 속성 을 추가 합 니 다.이 옵션 을 사용 하면 Complete a Swift 4 minimize inference migration 에 따라 변환 을 완료 해 야 합 니 다.
  • Match Swift 3 Behavior 는 컴 파일 러 가 암시 적 으로 추정 하 는 모든 방향 코드 에@obbc 속성 을 추가 합 니 다.이 옵션 은 바 이 너 리 파일 의 크기 를 바 꾸 지 않 습 니 다.Swift 3 암시 적 으로 모든 곳 에 명시 적@obbc 속성 을 추가 한 것 으로 추정 되 기 때 문 입 니 다.
  • 미리 보기 변환 코드,문제 없습니다.Save.

  • 3.오류 수정
    상기 5 단 계 를 완성 한 후에 swift 버 전 을 보면 4.0 입 니 다.
    이로써 일 을 마치 고 마침 잘 맞 게 끝났다.하지만 그렇지 않 습 니 다.실행 할 때 이것 을 볼 수 있 습 니 다.
    울 고 싶 은 지 눈물 이 없 는 지,이렇게 많은 실 수 를 두려워 하지 마 세 요.사실은 바 꿀 곳 이 많 지 않 습 니 다.어떤 것 은 모두 중복 되 어 있 으 니 직접 전체 국면 으로 바 꿀 수 있 으 면 됩 니 다.
    밤 을 들다
  • class dynamic func
  • //    
    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.@obbcswift4.0 의 가장 큰 특성 중 하 나 는 바로 @objc 수정자 의 변화 이다.주로 OCswift 을 혼합 할 때 일부 방법의 호출 과 속성 획득 문 제 를 처리 하고 swift4.0swift3.x 에서 일부 암시 적 유형 으로 추정 되 는 특성 을 제거 한 후에 @objc 수정자 를 수 동 으로 관리 해 야 한다.위의 글 에서 Xcode 변환 swift4.0 을 사용 할 때 우 리 는 Minimize Inference 옵션 을 선택 했다.그러면 우 리 는 관련 @objc 수식 자 를 수 동 으로 처리 하여 OCswift 코드 가 정상적으로 서로 호출 될 수 있 도록 해 야 한다.
    1.@objc 수정자 수 동 처리 절차
    '최소 화'변환 코드 를 사용 한 후 구축 과 운행 시의 문 제 를 처리 해 야 하 며,초기 swift4.0 변환 을 마 친 후 에는 아래 절차 에 따라 다른 문 제 를 처리 해 야 한다.
  • 당신 의 공 사 를 실행 합 니 다
  • 복구 컴 파일 러 알림 @objc 을 추가 해 야 하 는 곳
  • 코드 를 테스트 하고 컴 파일 러 알림 을 복구 하 는 데 추천 하지 않 는 암시 적 @objc 참조 경 고 를 사 용 했 습 니 다.경고 없 이
  • 프로젝트 의 build settings 를 엽 니 다.
  • Swift 3 @objc inferenceDefault.
  • 으로 설정 했다.
    2.@objc 수정자 가 처리 해 야 할 문제
  • 컴 파일 경고
  • swift 에서 컴 파일 된 경고 #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
    
  • Objective-C 컴 파일 시 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
  • Stringcharacters 속성 이 폐기 되 었 습 니 다
  • let string = "abc"
    var count = string.characters.count
    
    //      
    'characters' is deprecated: Please use String or Substring directly
    
    //      
    count = string.count
    
  • StringaddingPercentEscapes 방법 이 폐기 되 었 습 니 다
  • // 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 
    

    좋은 웹페이지 즐겨찾기