これをswift2.0対応させてみたので,詰まったところを書いておく.
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を無効化したいんです.
これを参考に,ドメイン指定によるATS無効化をやることにしよう.
/etc/hostsに
127.0.0.1 whalebird.localdomain
と書いておいて,このドメインだけATSを無効化しました.
@testable便利
以前はこういう問題があったんですけど,testableのおかげでこういうことせずにクラスを呼び出すことができました.h3poteto.hatenablog.com
割と楽です.