はじめに
この前 Swift を書いてるのに val とか fun とか書いちゃってた。。。このままでは恐ろしい勢いで Swift を忘れてしまう!と思い Swift 備忘録を作成することにしました。
データ型
データ型は下記のようなものがあります。
型 | データ | リテラル例 |
---|---|---|
Int | 符号あり整数値 | 123 |
UInt | 符号なし整数値 | 123 |
Float | 32ビット浮動小数点数 | 1234.56 |
Double | 64ビット浮動小数点数 | 1234.5678 |
Bool | 真偽値 | true |
Character | 文字 | "a" |
String | 文字列 | "文字列" |
Array | 配列 | [1, 2, 3] |
Dictionary | 連想配列 | ["A": "1", "B": "2"] |
Any | 何でもいける | なし |
変数宣言
変数宣言は let 変数名: 型
もしく var 変数名: 型
はのように行います。
1 2 3 4 5 |
let number: Int = 42 var number: Int = 42 // 型推論により型は省略可 let number = 42 |
型変換
数値 <-> 数値変換
数値から数値への変換は下記。各種イニシャライザがある。
1 2 3 4 5 6 7 8 9 10 11 |
let double: Double = 1.25 Float(double) // 1.25 Int(double) // 1 let int: Int = 3 Float(int) // 3.0 Double(int) // 3.0 let float: Float = 1.23 Double(float) // 1.2300000190734863 Int(float) // 1 |
文字列 <-> 数値変換
文字列 <-> 数値の変換も下記のように各種イニシャライザがある。
文字列 -> 数値の変換結果は Optional 型になる。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 数値 -> 文字列 let int: Int = 10 let float: Float = 10.25 let double: Double = 10.340 String(int) // "10" String(float) // "10.25" String(double) // "10.34" // 文字列 -> 数値 Int("10") // Optional(10) Float("10.25") // Optional(10.25) Double("10.340") // Optional(10.34) |
定数
const
はない?ので let
でいいと思う。
文字列操作
文字列操作色々
長さ
1 |
print("あいうえお".count) // 5 |
抜き出し
1 2 3 4 5 6 |
let str = "あいうえお" print(str.prefix(3)) // あいう print(str.suffix(3)) // うえお let partString = str[str.index(str.startIndex, offsetBy: 1)..<str.index(str.startIndex, offsetBy: 3)] print(partString) // いう |
切り出しはめんどくさいので下記のように extenstion を作成した方がいいと思う。(参考:【Swift】Substringを簡単にしたい)
1 2 3 4 5 6 7 8 9 10 11 |
let str = "あいうえお" print(str[3]) // え print(str[-3]) // う print(str[1...4]) // いうえお print(str[1..<4]) // いうえ print(str[...3]) // あいうえ print(str[...(-3)]) // あいう print(str[..<4]) // あいうえ print(str[..<(-3)]) // あい print(str[3...]) // うえ print(str[(-3)...]) // うえお |
結合
1 |
print("あいう" + "えお") // あいうえお |
大文字・小文字変換
1 2 |
print("abcde".uppercased()) // ABCDE print("ABCDE".lowercased()) // abcde |
置換
1 |
print("あいうえおいう".replacingOccurrences(of: "いう", with: "IU")) // あIUえおIU |
検索
1 2 3 4 5 6 7 |
let str = "あいうえお" print(str.hasPrefix("あい")) // true print(str.hasSuffix("うえお")) // true print(str.contains("う")) // true // String.Indexが得られる print(str.firstIndex(of: "あ")) // Optional(Swift.String.Index(_rawBits: 1)) |
分割
1 2 3 |
let str = ",あい,うえ,お," print(str.split(separator: ",")) // ["あい", "うえ", "お"] print(str.components(separatedBy: ",")) // ["", "あい", "うえ", "お", ""] |
split
と components
の違いは下記参考
参考:Swiftの文字分割におけるsplit(separator:)とcomponents(separatedBy:)の違い
テンプレート
1 2 |
let str = "abc" println("\(str) lenght is \(str.count)") // abc lenght is 3 |
空文字判定
1 2 3 4 5 |
print("".isEmpty) // true // 半角スペース print(" ".isEmpty) // false // 全角スペース print(" ".isEmpty) // false |
配列
Mutable にしたい場合は var
で宣言する。
初期化
1 2 3 4 5 6 7 |
let list = ["AA", "BB"] var list = [String]() var list: [String] = [] // 繰り返し let list = Array(repeating: 0, count: 3) // [0, 0, 0] let list = Array(repeating: "A", count: 3) // ["A", "A", "A"] |
追加
1 2 3 4 5 6 7 8 |
var list = ["AA", "BB"] list.append("CC") list.append(contentsOf: ["DD", "EE"]) list += ["DDD"] print(list) // ["AA", "BB", "CC", "DD", "EE", "DDD"] list.insert("GG", at: 3) print(list) // ["AA", "BB", "CC", "GG", "DD", "EE", "DDD"] |
削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var list = ["AA", "BB", "CCC"] list.removeLast() print(list) // ["AA", "BB"] list = ["AA", "BB", "CCC"] list.removeFirst() print(list) // ["BB", "CCC"] list = ["AA", "BB", "CCC"] list.remove(at: 1) print(list) // ["AA", "CCC"] list = ["AA", "BB", "CCC"] list.removeAll() print(list) // [] |
その他便利メソッド・プロパティ
豊富にあるのでリストでなにかやりたかったら一度検索するといいかも。
参考:Array ドキュメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
var list = ["1", "1", "2", "3"] print(list.count) // 4 print(list.indices) // 0..<4 print(list.contains("2")) // true print(list.contains { Int($0) == 2 }) // true print(list.firstIndex(of: "1")) // Optional(0) print(list.lastIndex(of: "1")) // Optional(1) print(list.firstIndex { Int($0) == 1 }) // Optional(0) print(list.lastIndex { Int($0) == 1 }) // Optional(1) print(list.first { Int($0) == 1 }) // Optional("1") print(list.last{ Int($0) == 1 }) // Optional("1") print(list.isEmpty) // false print(Array(list.reversed())) // ["3", "2", "1", "1"] print(list.sorted()) // ["1", "1", "2", "3"] print(list.allSatisfy { $0.count == 1 }) // true print(list.filter { Int($0)! > 1}) // ["2", "3"] print(list.map { Int($0)! }) // [1, 1, 2, 3] // maxのときの不等号が気持ち逆!! print(list.max { Int($0)! < Int($1)! }) // 3 print(list.min { Int($0)! < Int($1)! }) // 1 print([nil, "1", nil, "2", "3"].compactMap { $0 }) // ["1", "2", "3"] print([["1", "2", "3"], ["A", "B"]].flatMap { $0 }) // ["1", "2", "3", "A", "B"] // 集計 let nums = [1, 1, 2, 3] print(nums.reduce(0) { $0 + $1 }) // 7 print(nums.reduce(0, +)) // 7 print(nums.reduce(1, *)) // 6 // ループ処理 list.forEach { print($0) } list.enumerated().forEach { print("offset: \($0.offset), element: \($0.element)") } |
Optional型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var str: String? str = "A" print(str?.count) // Optional(1) // forced unwrapping (強制的アンラップ) print(str!.count) // 1 // 三項演算子 var length = str?.count ?? 0 let text: String? = "A" if let text = text { print(text) // "A" } guard let guardText = text else { return } print(guardText) // "A" |
if-let
と guard-let
のアンラップ法はなんていうんだろう??
キャスト
1 2 3 4 5 6 7 8 |
let text: Any = "ABC" let str1 = text as! String print(str1) // "ABC" let str2 = text as? String print(str2) // Optional("ABC") if let str3 = text as? String { print(str3) // "ABC" } |
制御文
if
1 2 3 4 5 6 7 8 9 |
let a = 1 let b = 2 if a < b { print("a < b") } else if a == b { print("a == b") } else { print("a > b") } |
switch
1 2 3 4 5 6 7 8 9 10 11 |
let num = 4 switch num { case 0: print("0") case 1: print("1") case 2...4: print("2~4") default: print("あてまはらない!") } |
enum
と組み合わせるといい。enum
をすべて case で記載する場合は default 不要。
for
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for i in 0..<3 { print(i) // 012 } for i in 0...3 { print(i) // 0123 } let numList = [1, 2, 3] for num in numList { print(num) } for (index, value) in numList.enumerated() { print("index: \(index), value: \(value)") } |
while
1 2 3 4 5 6 7 8 9 10 |
var num = 0 while num < 3 { print(num) // 012 num += 1 } repeat { print(num) // 3 num += 1 } while num < 3 |
処理抜け
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
for i in 0...3 { if i > 1 { break } print(i) // 01 } for i in 0...3 { if i == 1 { continue } print(i) // 023 } loop:for i in 0...3 { for j in 0...3 { if j == 2 { continue loop } print("i: \(i), j: \(j)") } } // 出力 // i: 0, j: 0 // i: 0, j: 1 // i: 1, j: 0 // i: 1, j: 1 // i: 2, j: 0 // i: 2, j: 1 // i: 3, j: 0 // i: 3, j: 1 |
さいごに
長くなったのでクラスとか関数については分割します。
コメント
[…] その1の続きです。関数とクラスとかについて書きます。 […]