少しスマホアプリに興味が出てきたので、Swiftを触ってみようと思いました。とりあえず最初にA Swift Tourをやってみたのでその感想です。
A Swift Tourで何が学べる?
Swiftの基本文法が分かります。サイトからダウンロードできるPraygroundで実行結果を確認しながら学ぶことができます。
軽くまとめ
動的型付け。変数宣言は var a=42; 定数は let a=42; 型を指定したいときは let a: Double=70; と後ろに型を明示する。
キャストは String(a) 。型を前に書いてキャストしたい変数を()で囲む。
文字内変数展開は "I have (apples) apple."。()で展開したい変数を囲む。文字列を”””(ダブルクォート3つで囲むことでも宣言できる。
配列を var shoppingList = ["catfish", "water","tulips"]で宣言できる。動きはリスト。辞書は
var occupations = [
"Malcolm" : "Captain" ,
"Kaylee" : "Mechanic" ,
]
空を作りたいなら let emptyArray=String let , emptyDictionary=[String:float]
型情報が推測できるならshoppingList = [] occupations = [:]
for文はlet individualScores = [ 75 , 43 , 103 , 87 , 12 ] for score in individualScores {}という形。これ、foreach文だよね・・・。
if文はよくある形。nilを許すとvar optionalString : String ? = "Hello"という形にする。nilを使った二項演算子は( nickName ?? fullName )
swiich文もある。switch vegetable{} ()はいらない。
複数の辞書に対するfor文はfor ( kind , numbers ) in interestingNumbers {}
while文もある。()はいらない。do-whileではなくrepeat-while。
for i in 0 ..< 4 {}と、..<を使えばインデックスの範囲を作成できる。
関数の宣言と呼び出し方は
func greet(person : Stirng, day : String)->String{
return "Hello \ ( person ) , today is \ ( day ) ."
}
greet ( person : "Bob" , day : "Tuesday" )
関数の宣言に変数名と型名が必要かつ、呼び出しにも必要。返り値の方は関数宣言の最後に->を伴って書く。
タプルがあり、タプルを関数で使うときは
func calculateStatistics ( scores : [ Int ]) -> ( min : Int , max : Int , sum : Int ) {
return ( min , max , sum )
}
let statistics = calculateStatistics ( scores : [ 5 , 3 , 100 , 3 , 9 ])
print ( statistics . sum )
関数をネストできる。
func returnFifteen () -> Int {
var y = 10
func add () {
y += 5
}
add ()
return y
}
returnFifteen ()
関数は型なので、関数を返り値、引数に用いることができる。
map関数がある。
numbers . map ({ ( number : Int ) -> Int in
let result = 3 * number
return result
})
let mappedNumbers = numbers . map ({ number in 3 * number })
print ( mappedNumbers )
let sortedNumbers = numbers . sorted { $0 > $1 }
print ( sortedNumbers )
クラスがある。
class NamedShape {
var numberOfSides : Int = 0
var name : String
init ( name : String ) {
self . name = name
}
func simpleDescription () -> String {
return "A shape with \ ( numberOfSides ) sides."
}
}
initは、インスタンスの作成時に呼ばれる関数。 サブクラスの例は
class Square : NamedShape {
var sideLength : Double
init ( sideLength : Double , name : String ) {
self . sideLength = sideLength
super . init ( name : name )
numberOfSides = 4
}
func area () -> Double {
return sideLength * sideLength
}
override func simpleDescription () -> String {
return "A square with sides of length \ ( sideLength ) ."
}
}
let test = Square ( sideLength : 5.2 , name : "my test square" )
test . area ()
test . simpleDescription ()
getterとsetterを含むこともできる。
列挙体enum、構造体structもある。メソッドを関連付けられる。
protocol(いまいちわからなかった。クラスのようなもの?)
例外処理は、try-catchではなくdo-catch。
let printerSuccess = try ? send ( job : 1884 , toPrinter : "Mergenthaler" ) let printerFailure = try ? send ( job : 1885 , toPrinter : "Never Has Toner" )
という方法も。二項演算子と理解。
defer{ 何かの処理 }を関数内に書いておくと、どこに書いていてもその関数の最後に実行され、エラーをthrowしても実行される。
ジェネリックもある。
func makeArray < Item >( repeating item : Item , numberOfTimes : Int ) -> [ Item ] {
var result = [ Item ]()
for _ in 0 ..< numberOfTimes {
result . append ( item )
}
return result
}
makeArray ( repeating : "knock" , numberOfTimes : 4 )