Swift3.0を学ぶにあたって知っておきたい基礎文法(後編)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Swift3.0を学ぶにあたって、言語的に必要そうな部分を広く浅く一覧した記事の後編です。
一ヶ月以上空いてしまいましたが、前編はこちらになります。

Array

配列

// 'Int'の配列
let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15]

// 'String'の配列
let fruits = ["apple", "orange", "grape"]

空の配列の宣言は下記のように書ける

var emptyDoubles: [Double] = []
var emptyFloats: Array<Float> = Array()

Dictionary

キーと値のペアのリスト

let fruitPrices = ["apple": 100, "orange": 200, "grape": 300]

キーと値のペアなしで辞書を作成するには、[:]を使う

var emptyDict: [String: String] = [:]

タプル

()で囲った,カンマ区切りのリスト。 配列と違って異なる型の値をまとめることができるけど、要素を追加したり削除することはできない。 宣言した順に、0, 1... で値を取得出来る

let sample = ("apple", 100, 5.3)

print(sample.1) // 100

また、ラベルをつけることが出来る

let sample = (name: "apple", price: 100, rate:5.3)

print(square.name)    // "apple"
print(square.price)   // 100
print(square.rate)    // 5.3

if文

()が不要 基本的に他の言語と変わらない。

if 条件 {
} else if 条件 {
} else {
}

範囲を指定する場合、以下のような記述も出来る。

if statusCode >= 200 && statusCode <= 299 {
   // 処理
}

↓

if case 200 ... 299 = statusCode {
   // 処理
}

ループ

for

for-in Loop形式。これも基本的に他の言語と変わらない。

for i in 1...3 { // 1,2,3
    print(i)
}

let fruits = ["apple", "orange", "grape"]
for fruit in fruits {
    print(fruit)
}

let fruitPrices = ["apple": 100, "orange": 200, "grape": 300]
for (name,price) in fruitPrices { 
    print("\(name)\(price)")
}

while

条件になるまでループする形式。最初に判定するケースと後で判定するケースの2パターン。

while !endOfFile {
 readLine()
}
repeat {
 performTask()
} while tasksRemaining > 0

function

関数。基本的な文法のサンプルは下記のとおり。

// 引数戻り値なし
func sample() {
}

// 引数あり
func sample(id :Int) {
}

// 戻り値あり
func sample() -> Bool }
  return true
}

// 引数・戻り値あり
func sample(name: String) -> String {
  return ""
}

デフォルト引数について(Swift3.0からの変更点)

デフォルト引数不要を追加 (SE-0060)

func defaultArguments(a: Int = 0, b: Int = 0, c: Int = 0) {}
defaultArguments(a: 0) // ok
defaultArguments(b: 1) // ok
defaultArguments(c: 2) // ok
defaultArguments(a: 1, c: 2) // ok
defaultArguments(b: 1, c: 2) // ok
defaultArguments(c: 1, b: 2) // error

クラス

他の言語と大差ないと思う。参照型

class className {

}

サブクラス

別のクラスを継承する。

class className : SuperClassName {

}

※ サブクラスの可否についてはアクセス修飾子による

override

オーバーライドはoverrideを付ける。

class sampleViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

※ オーバーライドの可否についてはアクセス修飾子による

アクセス修飾子

クラスやプロパティやメソッドへのアクセス範囲
Swift3では、以下の種類がある

open モジュール外からもアクセスできる。 一番ゆるいアクセスコントロール。
public モジュール外からもアクセスできる。 サブクラス化されない。 overrideできない。
internal モジュール内ならアクセスできる。 何も書かないとコレになる。(デフォルト)
fileprivate 文字通りファイル内ならアクセスできる。
private クラスなど宣言内でしかアクセスできない。

構造体 struct

値型。
定義は下記

struct StructName {
    let property: Type

    func function() {
    }
}

[参考] 構造体とクラスの使い分けについて
Swiftのクラスと構造体の使い分けについてのメモ|Qiita

Enum 列挙型

関連する値を型としてまとめたもの。

enum Alignment {
 case left, right
}
let textAlignment = Alignment.left
switch textAlignment {
case .left:
 print("Lean to the left")
case .right:
 print("Lean to the right")
}

列挙型にメソッドを定義することも出来ます。

enum Alignment {
 case left, right
 
 func arrow() -> String {
         switch(self) {
         case .left:
             return "←"
         case .right:
             return "→"
         }
     }
}
let alignment = Alignment.right
print(alignment.arrow())    // →

Protocol

Javaでいうところのインターフェースのように、クラスや構造体に実装するプロパティやメソッドを定義する。
文法は protocol プロトコル名 {} と記述する。

protocol SomeProtocol {
    func someMethod()
}

protocolを利用するには:の後に指定する。複数の場合は,で区切って記述する。

struct SomeStructure: SomeProtocol, AnotherProtocol {
    someMethod()
}

クラスの場合はスーパークラスがある場合はその後に,で区切って記述する。

class SomeClass: SuperClass, SomeSuperclass, AnotherProtocol {
    someMethod()
}

Protocols|The Swift Programming Language

extension エクステンション

クラス、構造体、列挙型などに機能を追加して拡張することが出来る。
文法は extension 拡張対象 {} と記載する。

extension String {
	// 文字列からHTMLタグを取り除くメソッドを追加
    func removeHtmlTag() -> String {
        return replacingOccurrences(of: "<(\"[^\"]*\"|'[^']*'|[^'\">])*>", with: "", options: .regularExpression, range: nil)
    }
}

let word = "あい<p>う</p>えお"
print(word.removeHtmlTag()) // あいうえお

Closure クロージャ

関数オブジェクトの一種。具体的にはGetting Started with Swift|WWDC2016Swift Closure クロージャ記法 いろいろ | タコさんブログ の説明が判りやすい。

let numbers = [4, 17, 34, 41, 82]
func divisibleByTwo(_ number: Int) -> Bool {
 return number % 2 == 0
}
let evenNumbers = filterInts(numbers, divisibleByTwo)
print(evenNumbers) // [4, 34, 82]

例えば上記のような処理がある場合、divisibleByTwoの部分は以下の様に書くことが出来る。

let evenNumbers = filterInts(numbers,{ (number: Int) -> Bool return number % 2 == 0 })
print(evenNumbers)

さらに省略すると最終的には下記の記法になる。

let evenNumbers = filterInts(numbers) { $0 % 2 == 0 }

さいごに

足りない部分は多々あると思いますが、前編とあわせてこれらをおさえておけば7〜8割くらいはSwiftのコードが読めるようになる?のではと思います。