ラベル Swift勉強 の投稿を表示しています。 すべての投稿を表示
ラベル Swift勉強 の投稿を表示しています。 すべての投稿を表示

値を文字列と結合

値を文字列と結合したいときは
let a = 1
let result = "total " + String(a)
のように書くと、aから文字列が生成されるので文字列演算で結合できます。

よくあるコードなので簡単な書き方が用意されていて、
"total \(a)"
と、\()で値を囲むだけでもOKです。


インスタンスのキャストと同時に型チェック

インスタンスをダウンキャストするときに気になるのが型チェック。

Swiftではas?という便利なキャストが使えます。

?が付いていることから予想できる通りoptionalを返すため、キャストできないときはnilとなります。

オプショナルバインディングと組み合わせるのが良さそうですね。

if let a = b as? C {
    // bがCクラスのインスタンスにキャストできる場合に実行される
}

高機能なenumをシンプルに使う

Swiftのenumは有限の集合を定義することに特化したクラスのように振舞います。

しかし、Cのenumのようにシンプルに使うことも可能。

enum MyType: Int {
    case a
    case b
    case c
}

Intを継承するような形で書くと、a, b, cはそれぞれ0, 1, 2に対応します。

Intで取り出したい場合は
MyType.a.rawValue
と、rawValueでアクセス。

ちなみに
let type = MyType.a
ptint(type)
とすると、0ではなくaが出力されます。
enumと文字列の変換関数を実装する必要がないですね!

ArrayとDictionary

SwiftのArrayとDictionaryは覚えやすいですね。
書き方は色々ありますが、、、
let array: [Int] = [1, 2, 3]
let dict: [String : Int] = ["a" : 1, "b" : 2, "c" : 3]

[]の中にそのまま列挙すれば配列、key : value を列挙すれば辞書になります。

インクリメントするには

カウンターなどで変数の値を1増やすインクリメント処理。

他の言語ではおなじみの
i++
でインクリメント、、、できない!

i += 1
と書けばよいのですが、他に慣れてると変な感じです。

deferでクリーンナップ

エラー処理などのため関数の途中でreturnしたときに、クリーンナップ処理を書き忘れるのはよくある話。
排他制御でロック解除し忘れたりすると悲惨です。

そんなときに便利なのがdefer。

関数の中の任意の場所で
defer { ... }
としておくと、{}の中の処理を関数を抜ける直前に必ず実行してくれます。

ありがちなミスを防いでくれる便利な機能ですね。

Nil Coalescing ??

nilを扱うのに利用するoptionalですが、Nil Coalescingと呼ばれる書き方が便利です。

var text: String = "hello"
...
label.stringValue = text ?? "hi"

optionalがnilなら ?? の右側が使われます。
三項演算子で書くよりわかりやすくて楽ですね。

optionalをunwrap

optionalを定義したら使うときはきっちりunwrapする必要があります。

定義は

 let text: String? = "hello"

と?をつければOKですが、unwrapには複数の方法があるようです。

optional chaining

text?.uppercased()
としたときに、うっかりtextがnilでもuppercased()は実行されないようです。

アプリが落ちにくくなるという最低限の安全策にはなりそうですが、エラー処理はきっちり行いたいですね。

forced unwrapping

text!というふうに!をつけると強制的にunwrapできます。
が、nilでないことを保証するためoptionalを使っているわけで、思想的には極力使用を避けたいところ。

optional binding

if let str = text {
    ...
}
とするとunwrapした結果nilでない場合のみifのスコープが実行されます。

guard構文もそうですが、optionalは?や!でunwrapのイメージが強いので、間違ってつけないように気をつける必要があります。
間違ってもコンパイルエラーになるので気づきますが。

simplicity unwrapped optional

 let text: String! = "hello"

と?の代わりに!をつけるだけ。
textと書くだけで自動的に強制unrwapされます。
(要するに明示的なunwrapのシンタックスシュガー。)

当然nilに触っちゃう可能性があるので多用は厳禁、というか基本的に使いたくないですね。
使いどころとしてはXcodeが生成するIBOutlet。
UIパーツにアクセスするのに毎回unwrapは面倒&nilでないことは仕組み側で保証されているので、こういった限られたケースでは便利そうです。

guardでガード

optionalとセットで使うと最大限の効果を発揮するguard構文によるnilチェック。

Cで書くとnullチェックのif文になる箇所がことごとくguardでガードされていきます。

たくさんguardが並んでいるコードを見るにつけ、nilチェックの頻度の高さを実感しますね。

varとlet

変数はvar、定数はletと単純明解な使い分けですが、うっかり定数もvarにしてしまうのはありがち。

Swift 3のコンパイラは親切で、値の変更がないvarはletにするよう教えてくれます。

コードレビューで指摘されがちなポイントをあらかじめ潰せるあたり、よく考えられていますね。

強力な型推定

スクリプト系の言語ではメジャーな型推定。
C++11でも対応してきているように、組み込み系にも着実に浸透しつつあります。

が、やっぱり最初はきっちり理解したいのでしばらくは省略せずに書いておくことにします。

var count: Int = 0

でも、慣れてくると、やっぱり型省略によるコーディングが楽そうです。

Swiftといえば!?

初めてSwiftで書かれたコードを見た時の印象は!?!?

とにかく?や!がたくさん出てきて面食らいました。

optionalという機能のようで、C言語でよくやるnullチェックを言語レベルで対応してくれている、と考えると分かりやすそうですね。

様々なレベルの膨大な開発者が関わっているiOSアプリを実装するための言語ならではでしょうか。


Touchdown 1.3公開!

Touchdown 1.3を公開しました。 ダウンロードは こちら から。 Ver.1.3の変更点は以下の通りです。 新機能 macOS Mojave 10.13以降に対応 ダークモードに対応 ぜひお試しください。