iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
SwiftはCocoaフレームワークの為に設計されたプログラミング言語だ。
簡単なクラスの定義と実装は以下のとおり。
import Cocoa // 1
class Song: NSObject { // 2
var title: String // 3
init(title: String) { // 4
self.title = title
}
func play() { // 5
// ... 再生処理
}
}
上記で定義したクラスをインスタンス変数の生成とメソッド呼び出し、プロパティの参照は以下のとおり。
let song = Song(title: "Maybellene") // 1
song.play() // 2
println("\(song.title)") // 3
Swiftではカテゴリを拡張(Extensions)と呼んでいる。
extension String {
func reverse() -> String {
var charadterArray: Charater[] = Character[]()
for haracter in self {
charadterArray.append(character)
}
var reverseString: String = ""
for var i = characterArray.count - 1; 0 <= i; i-- {
reverseString += characterArray[i]
}
return reverseString
}
}
Stringクラスにreverseメソッドが追加された事を確認する。
let hello = ""
let reverseString = hello.reverse()
println("\(reverseString)")
プロトコルはプロトコル(Protocols)だ。先ほどのSongクラスのメソッドをプロトコルで宣言するように変更してみよう。
protocol Playable {
func play()
func stop()
}
class Song: NSObject, Playable {
var title: String
init(title: String) {
self.title = title
}
func play() {
println("... 再生処理")
}
func stop() {
println("... 停止処理")
}
}
改行までは一つの文。C言語であった終端を示すセミコロン(;)は不要。
コメントはK&R Cと同様に/*で始め、*/で終わる記法と、C++の//から改行までの両方に対応する。
英字と数字、それに加え、一部制限があるがUnicodeに対応しているので日本語も使える。ただし、最初の文字は数字以外でなければならない。
次の識別子はキーワードとして処理系によって予約されている。
class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var
break, case, continue, default, do, else, fallthrough, if, in, for, return, switch, where, while
as, dynamicType, is, new, super, self, Self, Type, __COLUMN__, __FILE__, __FUNCTION__, __LINE__
associativity, didSet, get, infix, inout, left, mutating, none, nonmutating, operator, override, postfix, precedence, prefix, right, set, unowned, unowned(safe), unowned(unsafe), weak, willSet
読みやすさの為に任意の位置に"_"を挿入する事ができる。値としては"_"は無視される。
2進数
let numMax = 0b010011010010
var num = 0b010011010010
8進数
let numMax = 0o2322
var num = 0o2322
10進数
let numMax = 1234
var num = 1234
16進数
let numMax = 0x04D2
var num = 0x04D2
読みやすさの為に任意の位置に"_"を挿入する事ができる。値としては"_"は無視される。
let a = 125.0
let b = 1.25e2
let c = 0.0125
let d = 1.25e-2
let e = 60.0
let f = 0x0Fp2
let g = 3.75
let h = 0x0Fp2
"文字列"
エスケープ列
NUL文字(\0)
バックスラッシュ(\\)
水平タブ(\t)
改行(\n)
復帰(\r)
2重引用符(\")
単一引用符(\')
文字列に変換
\(式)
16進指定
1バイト文字(\x12)
2バイト文字(\u1234)
4バイト文字(\U12345678)
代入演算子
代入式に論理演算が含まれているのがC言語と異なる点かな?
= *= /= %= += -= <<= >>= &= ^= |= &&= ||=
算術演算子
オーバーフローを無視する演算子の導入が新しい。
+ - * / % &+ &- &* &/ &% &
前置/後置演算子
インクリメント(++)とデクリメント(--)で、C言語と同様に変数の前に置く場合と、後ろに置く場合で返す値が異なる。
++ --
比較演算子
オブジェクトの比較(===と!==)とパターンマッチ(~=)が新しい。ただし、パターンマッチについては演算子の説明があるが利用方法の説明はない。これは将来の直接的な正規表現の対応の為に予約されているのか?
< <= > >= == != === !== ~=
三項演算子
式1が真なら式2が評価され、偽なら式3が評価される。
式1 ? 式2 : 式3
論理演算子
! && ||
ビット演算子
<< >> & | ^ ~
範囲演算子
新しく導入された演算子だ。Closed Range Operator(A...B)はA以上からB以下の範囲。Half-Closed Range Operator(A..<B)はA以上からB未満の範囲という意味だ。
... ..<
キャスト演算子
新しく導入された演算子だ。isは型チェック。asはキャスト。as?はOptional型へのキャスト。
is as as?
演算子の再定義は別の機会に。