LoginSignup
8
9

More than 5 years have passed since last update.

個人用Swiftまとめ

Posted at

はじめに

この記事は、初心者のための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())
8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9