Swift1.2 - Swift 2.0으로 자동 변환할 수 없는 오류 대응(Xcode 7+Swift2)

7998 단어 XCode7Swift2.0iOS

Xcode7.1로 업데이트하면 위의 대화상자가 표시됩니다.
보아하니, Swift1.2를 계속 쓸 수 있는 옵션이 없어 간신히 대처할 수밖에 없었는데....《김원일, 불의 제전》

컨디션


항목
구형
신제품
OS
Yosemite(10.10)
El Capitan(10.11)
Xcode
6.4
7.1
Target iOS
8.2
9.1
Swift
1.2
2.0

실천하다


엑스코드 베타를 착실하게 쫓는 사람은 스위프트2다.나는 0의 문법을 조금씩 다시 써서 천천히 넘어갔다고 생각한다.
하지만 저처럼 xcode의 정식 버전이 나온 다음에 대응하고 싶은 분들은 xcode 자체의 업데이트, iOS의 업데이트, Swift의 업데이트 3개가 겹쳐서 수십 개의 오류와 경고가 나왔잖아요.
  • 우선 자동 변환을 시도해 본다
  • Swift1.2개의 항목이 열리면 위의 Convert to Latest Syntax 인코더 63;대화 상자
  • 기계적으로 수정할 수 있는 부분을 절차에 따라 수정
  • 구축, 오류 및 경고 확인
  • 이때 문제 없이 구축을 통해 완성 시 행운
  • 자동 변환 후 오류 & 경고 발생 시 내용 확인 후 분할
  • 스위프트의 문법 문제인가요?(후술)
  • iOS 9에 대한 질문입니까?(실행은 가능하지만 네트워크에서 떨어지는 등 ATS의 문제일 수 있음)
  • 외부 라이브러리 문제요?(CocoaPod를 사용할 때 Podfile의'platform:ios,'9.1'을 xcode의 TargetOS와 일치시키는 등)
  • 자동 변환 박스


    새로 추가된 언어 사양

  • do
  • try, catch
  • 반환값을 통해 유형을 뚜렷하게 볼 수 있다

  • 『as!』의 다운로드 지정이 삭제되었습니다.
  • 조금 어렴풋하게 기억나지만Swift1.1부터 1.2로 업그레이드됐을 때 추가된 느낌이었는데...
  • sample_1_1.swift
    // 1.2
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! UITableViewCell
        return cell
    }
    
    // 2.0
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath)
        return cell
    }
    

    기타

  • println() -> print()
  • 자동 변환은 없지만 QuickFix가 유효한 경우


    var에서 let까지

  • 어쨌든 한 번만 사용한 값은 모두 상수(let)로 변한다.안전성 1위 언어규범이죠
  • 오류가 아니라 경고 수준
  • 이라고 생각합니다.
    sample_2_1.swift
    // 1.2
    var iconNum:Int = 2
    // 2.0
    let iconNum:Int = 2
    

    자동 변환할 수 없는 오류 및 대응


    직접 대답할 수는 없지만, 어떤 메시지가 어떤 이유로 나타나는지 상상할 수 있을 것 같다.

    Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?

  • 비임의 선택 대신 Forced Unwrapping또는 Optional Chaning(\63;)중 하나 선택
  • 응, 이것도 안전성에 대한 고려인가?
  • sample_3_1.swift
    // 1.2
    var title:String = textField.text
    // 2.0
    var title:String = textField.text!
    

    Use of unresolved identifier 'EKEventEditViewActionCanceled'


    EKEventEditViewDelegate
  • EKEvent는 달력과 알림을 조작하는 종류이지만 미묘한 상수변경
  • 이 있다
  • 문서에 "This information is subject to change, ~"라고 쓰여 있어 책망할 수 없습니다.
  • sample_3_2.swift
    // 1.2
    EKEventEditViewActionCanceled.rawValue
    // 2.0
    EKEventEditViewAction.Canceled.rawValue
    
    // 2.0
    enum EKEventEditViewAction : Int {
        case Canceled
        case Saved
        case Deleted
        static var Cancelled: EKEventEditViewAction { get }
    }
    

    Redundant conformance of 'HogeMainViewController' to protocol 'AdViewDelegate'

  • 프로토콜의 중복 정의(이중 정의)
  • 부류에서 같은 종류를 호출하기 때문에 부류에서 호출을 중지할 수 있음
  • sample_3_3.swift
    // 1.2
    class HogeMainViewController: HigeViewController, AdViewDelegate, UIScrollViewDelegate, WSCoachMarksViewDelegate {
    }
    
    // 2.0
    class HogeMainViewController: HigeViewController, UIScrollViewDelegate, WSCoachMarksViewDelegate {
    }
    
    

    Nil is not compatible with expected argument type '()'

  • 일부 옵션은 nil
  • 을 지정할 수 없습니다.
    sample_3_4.swift
    // 1.2
    item.managedObjectContext!.save(nil);
    // 2.0
    item.managedObjectContext!.save();
    

    좋은 웹페이지 즐겨찾기