Lavieleaf

おもったことをなんでも書くことろ

Swift2.0に更新したときのエラーメモ


Update Project

  1. Xcode 7.0.1にインストール後にプロジェクトファイルを開く

  2. Edit -> Convert -> To Latest Swift Syntax

    magicprefs
  3. プロジェクトファイル( project.pbxproj )を含めて,自動でコンバートされる.

Build errors

コンバートした後にビルドするといくつかエラーになった..

その①

'stringByAppendingPathComponent' is unavailable: Use URLByAppendingPathComponent on NSURL instead.

Stringクラスから stringByAppendingPathComponent メソッドが使えなくなってしまったので NSURLNSString を使う. ただ,修正箇所が多かったので以下のように対応した.

extension String {
    func stringByAppendingPathComponent(path: String) -> String {
        let nsString = self as NSString
        return nsString.stringByAppendingPathComponent(path)
    }
}

その②

Cannot invoke initializer for type 'sqlite3_destructor_type' with an argument list of type '(COpaquePointer)'

対応方法が stackoverflow にあったのでそのまま利用させてもらった.

// Swift 1.2
-    let SQLITE_STATIC = sqlite3_destructor_type(COpaquePointer(bitPattern: 0))
-    let SQLITE_TRANSIENT = sqlite3_destructor_type(COpaquePointer(bitPattern: -1))

// Swift 2.0
+    let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self)
+    let SQLITE_TRANSIENT = unsafeBitCast(-1, sqlite3_destructor_type.self)

その③

Cannot invoke initializer for type 'NSDictionary' with an argument list of type '(objectsAndKeys: NSData, CFString, NSDate, CFString)'

NSDictionary(objectsAndKeys: [AnyObject]) のイニシャライザが使えなくなってしまったので,NSDictionary(objects: [], forKeys []) に書き直す.

// Swift 1.2
var query: NSMutableDictionary = NSMutableDictionary(objectsAndKeys:
    kSecClassGenericPassword, kSecClass,
    identifier, kSecAttrGeneric,
    service, kSecAttrService
)

// Swift 2.0
let query: NSMutableDictionary = NSMutableDictionary(objects:
    [
        kSecClassGenericPassword,
        identifier,
        service
    ], forKeys:
    [
        kSecClass as NSString,
        kSecAttrGeneric as NSString,
        kSecAttrService as NSString
    ]
)

その④

Nil is not compatible with expected argument type 'NSStringCompareOptions'

NSStringCompareOptionsnil を指定できなくなったいたので空の配列を指定するようにする.

// Swift 1.2
let text = NSString(string: originText).stringByReplacingOccurrencesOfString(" ", withString: "", options: nil, range: nil) as String

// Swift 2.0
let text = NSString(string: originText).stringByReplacingOccurrencesOfString(" ", withString: "", options: [], range: nil) as String

Swift Library

Module file was created by an older version of the compiler; rebuild 'xxx' and try again: project/Frameworks/xxx.framework/Modules/xxx.swiftmodule/arm64.swiftmodule

Swift 1.2 でビルドしているモジュール ( .framwrok ) は,Swift 2.0でビルドし直す必要があった. モジュールも修正してSwift 2.0でビルドし直したらビルドが通りました.

iTunes Connect

Swift 2.0関係ないかもしれないけど,iTunes Connect にアップロードするときにエラー起きたのでメモ

Error Domain=ITunesConnectionOperationErrorDomain Code=1091 \"This bundle is invalid. The Info.plist contains an invalid key 'CFBundleResourceSpecification' in bundle xxx [xxx.app]\"

今まで CODE_SIGN_RESOURCE_RULES_PATH に「 $(SDKROOT)/ResourceRules.plist 」を設定しているのが原因だったので削除する.