swift2.0への変更で詰まったところ

これをswift2.0対応させてみたので,詰まったところを書いておく.

h3poteto.hatenablog.com


Xcode7を入れたあと,Xcode6.4で開発していたプロジェクトを開くと,初回に古いシンタックスをすべて置換してくれる.
ちなみにこれ,一度閉じてしまった場合でも,Edit->Convert->To Latest Swift Syntax でいける.

だいたい,使ってない変数を消してくれたり,varだけど代入していないものをletになおしてくれたりする.

そういうのがひと通り終わっても,コンパイルが通らなかったので以下メモ.

CGBitmapInfo

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue)
CGBitmapContextCreate(
    nil,
    Int(ceil(pixelSize.width)),
    Int(ceil(pixelSize.height)),
    CGImageGetBitsPerComponent(originalImageRef),
    0,
    colorSpace,
    bitmapInfo)

こんなコードを書いていたのだけれど,

error:Cannot convert value of type 'CGBitmapInfo' to expected argument of type UInt32

こんなことを言われる.

どうやらCGBitmapContextCreateの引数の型が変わったらしい.
幸いなことにCGBitmapInfoはrawValueというUInt32型を構造体が保持しているので,そいつを取り出してやれば良い.

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue)
CGBitmapContextCreate(
    nil,
    Int(ceil(pixelSize.width)),
    Int(ceil(pixelSize.height)),
    CGImageGetBitsPerComponent(originalImageRef),
    0,
    colorSpace,
    bitmapInfo.rawValue)


同じことがstackoverflowに質問されていたので,回答しておいた.stackoverflow.com


Dictionaryの型

var shintani: String?
let params: Dictionary<String, String> = [
    "yes" : "asumiss"
]
shintani = "ryoko"
let dict: Dictionary<String, AnyObject> = [
    "asumi" : params,
    "shintani" : shintani
]

これはAnyObjectで怒られる.

Type of expression is ambiguous without more context

そもそもString?型を突っ込んでいることに問題があるので(nullが入る可能性がありDictonaryとしては良くない),どこかでunwrapする必要がある.

var shintani: String?
let params: Dictionary<String, String> = [
    "yes" : "asumiss"
]
shintani = "ryoko"
let dict: Dictionary<String, Any> = [
    "asumi" : params,
    "shintani" : shintani!
]

viewControllersで取ってきたものの型チェック

型チェックがきつくなったので,viewControllersでとってきたものの型をちゃんとキャストしておかないといけない.

例えばこんなコードを書いていたとする.

if let controllers = appDelegate.rootController.viewControllers {
  for navController in controllers {
    if let target = navController.topViewController {
      // targetに対する処理
    }
  }
}

これだとtopViewControllersの呼び出しでコンパイルエラーになる.

if let controllers = appDelegate.rootController.viewControllers {
  for navController in controllers {
    if let controller = navController as? UINavigationController {
      if let target = controller.topViewController {
        // targetに対する処理
      }
    }
  }
}

こんな感じで,as UIViewContrllersしないとtopViewControllerとかできない

ATSをdebugで無効化

これがなかなかやっかいで…….
自作のサーバープログラムと通信するようなアプリを作っている場合,開発環境ではテストサーバーにつなぐことがほとんどだと思う.

だけど,開発環境のサーバーなんて,もちろんSSLなんて通しているはずがない.
っていうかオレオレ証明書ですら挟むのめんどくさい.

そもそもローカルでrails sしただけのサーバーに繋ぎたいし.


というわけで,debugモードの時だけATSを無効化したいんです.


qiita.com


これを参考に,ドメイン指定によるATS無効化をやることにしよう.


/etc/hostsに

127.0.0.1  whalebird.localdomain

と書いておいて,このドメインだけATSを無効化しました.


@testable便利

以前はこういう問題があったんですけど,testableのおかげでこういうことせずにクラスを呼び出すことができました.h3poteto.hatenablog.com


割と楽です.