はじめに
この記事は、初心者のためのSwiftで始めるプログラミング入門や初心者のためのSwiftプログラミング入門をベースに、僕個人(一応Pythonista)がSwiftを始めるにあたってまとめたメモです。
随時更新しています。
文法
変数
var hoge = "hoge"
// 明示的に型を指定
var baz: Int = 12345
定数
let foo = "bar"
typeformatter
let price = 100
println("イチゴは\(price)円です") // -> イチゴは100円です
基本型
String, Int, Bool, Double, Floatとか
組み合わせ演算子
// +=, -=, /=, *=などは利用可能
演算子オーバーロード
let 名前 = "Swift太郎"
println("私は" + 名前 + "です")
if-else文
let ナスの値段 = 100
if ナスの値段 <= 300 {
println("ナスは300円以下")
} else if ナスの値段 <= 200 {
println("ナスは200円以下")
} else if ナスの値段 <= 100 {
println("ナスは100円以下")
} else {
println("ナスは301円以上")
}
switch文
let 松茸 = 8000
switch 松茸 {
case 0:
println("松茸はタダ")
case 1...10000:
println("松茸は10,000円以下")
case 100000, 1000000:
println("松茸がすごい高くてしかもキリ番")
default:
println("高級な松茸")
}
- breakはいらない
- ,で複数の値を設定可能
- ...で範囲指定が可能
for文、while文
// for
var 値段 = 100
for 回数 in 1...10 {
値段 *= 2
}
println("最終的な値段は\(値段)円")
// for-2 -> Pythonみたい!
for トップス in クローゼット {
println("\(トップス)を取り出しました")
}
// while
var 枚数 = 0
while 枚数 < 10 {
枚数 += 1
println("\(枚数)皿目")
}
println("お寿司を\(枚数)皿食べた")
コレクション系
配列、辞書、セットがある
// 配列
// 二つは一緒
var arr1 = [Int](count:10, repeatedValue:0)
var arr2 = [0,0,0,0,0,0,0,0,0,0]
配列の基本操作→http://libro.tuyano.com/index3?id=5226003&page=3
辞書の基本操作→http://libro.tuyano.com/index3?id=5226003&page=5
関数
// Intを受け取ってIntを返す
func plusTwo(x: Int) -> Int {
return x + 2
}
// 外部名を設定する
// [外部名 内部名: 型]という形で宣言する
func plusTwoNumAndPlusTwo(num1 x: Int, num2 y: Int) -> Int {
return x + y + 2;
}
plusTwoNumAndPlusTwo(num1:10, num2:20) // = 32
// ショートハンド
// 外部名=内部名
func plusTwoNumAndPlusTwo(#x: Int, #y: Int) -> Int {
return x + y + 2;
}
plusTwoNumAndPlusTwo(x:10, y:20) // = 32
// デフォルト値の設定も可能
func tax(#price: Int, rate: Double = 0.08) -> Int {
return Int(Double(price) * (1.0 + rate))
}
// 複数の値を返せる
func plusTwoAndHokuto(x: Int, y: String) -> (Int, String) {
return (plusTwo(x), y + "Hokuto")
}
// クロージャ
let plusTwoClosure : Int -> Int = {x in x + 2}
// 関数の引数に関数を渡す
func calc(arg: Int, f: Int -> Int) -> Int {
return f(arg)
}
calc(100, plusTwoClosure) // = 102
1
// 関数の返り値を関数にする
func add(x: Int) -> Int -> Int {
func addX(y: Int) -> Int {
return x + y
}
return addX
}
let add10 = add(10)
add10(5) // = 15
// カリー化
func add(x: Int)(y: Int) -> Int {
return x + y
}
let add10 = add(10)
add10(5) // = 15
// 可変引数
func allAdd(#nums: Int...) -> {
var total = 0
forn in nums {
total += num
}
return total
}
// INOUTキーワード
// 参照渡し的なこと
func tax(inout price:Int, rate:Double = 0.08) -> Void {
price = Int(Double(price) * (1.0 + rate))
}
var num = 12300
tax(&num) // num == 12300 * 1.08
クラス
一般的な言語との差異のみ
Computedプロパティ
getのみにすると変更不可になる
class Friend {
var name:String
var old:Int
var age:Int {
get {
return old
}
set {
if newValue > 0 {
old = newValue
}
}
}
init(name:String, age:Int) {
self.name = name
self.old = age
}
func printData() {
println("\(self.name) (\(age))")
}
}
var you = Friend(name: "Taro", age: 30)
you.printData()
クラス変数・クラスメソッド
頭にclassをつける
構造体
クラスと似ているが、イニシャライザ自動生成、継承できない、参照ではないなどの特徴がある
protocolとextensiton
protocol
Javaでいうところのインタフェースかな?
protocol MyProtocol {
func printData ()
}
class PersonData: MyProtocol {
var name:String = ""
init(name:String) {
self.name = name
}
func printData() {
println("[name: \(name).]")
}
}
class MemoData: MyProtocol {
var content:String = ""
init(content:String) {
self.content = content
}
func printData() {
println(content)
}
}
var data:[MyProtocol] = []
data.append(PersonData(name: "山田太郎"))
data.append(MemoData(content: "明日9時から会議"))
for obj in data {
obj.printData()
}
extension
あとづけ可能
extension Int {
func getTotal()->Int {
var total:Int = 0
for i in 1...self {
total += i
}
return total
}
}
var num = 1234
println(num.getTotal())