Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Swift3.0】Swiftの基礎 #1

More than 3 years have passed since last update.

はじめに

Swiftの基礎や、よく使うパターンなどについて
ひたすら纏めていきます。

まずは、基礎から纏めます。

前提

以下の開発環境での情報を記載します。
Xcode 8.3ではありません。

Category Version
Swift 3.0.2
Xcode 8.2.1

Swiftのバージョンを確認できるコマンド
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version
↑↑ Xcode.appをリネームしている場合は、適宜読み替えてください。

01. 変数と定数

変数

var 変数名: 型名 = 初期値

Demo-1.swift
// Int型の変数numを宣言し、0で初期化
var num: Int = 0

// 変数numに1000を代入
num = 1000

// String型の変数strを宣言し、"foo"で初期化
var str: String = "foo"

定数

let 定数名: 型名 = 定数

Demo-2.swift
// Int型の定数height
let height: Int = 180

// String型の定数name
let name: String = "okuderap"

ちなみに、varはVariableのことらしいです。
letは、Letをそのまま。

02. 型推論

明示的に型を宣言せず、代入された値から型を判別してくれるやつのことです。

Demo-3.swift
// String型
let str = "foo"

// Int型
var intVal = 10

// Double型
var doubleVal = 123.4

型推論可能な場合は、基本的に型推論を利用する方向でいきたいと思います。

03. Optional Type (オプショナル型)

Swiftの通常の型はnilを使用することができない。
nilを代入すると、コンパイルエラーが発生してしまいます。

Optional Typeは、nil(空の値)を使用することができる型のひとつです。

Demo-4.swift
// Optional Typeの宣言1
// 宣言のみの場合、初期値はnil
var str1: Optional<String>
print(str1) // nil

// Optional Typeの宣言2 (上と同じこと)
// 宣言のみの場合、初期値はnil
var str2: String?
print(str2) // nil


var str3: String? = "foo"
// nilの代入も可能
str3 = nil
print(str3) // nil

String?は「Optional Type」で、「String」とは型が異なるため
Stringのメソッドは使用することができない。

イメージとしては、以下のStringの配列(Array型)が、Stringのメソッドを呼び出せていないのと同じです。
2017-04-10 2.52.16.png

String?をStringとして使用するためにunwrap(アンラップ)をする必要があります。

unwrap: Optional<T>からT型の変数を取り出すこと。
(Tは、StringやIntのような型を示します。)

unwrap1. Forced Unwrapping

nilかどうかに関わらず強制的にアンラップする。nilだった場合は、クラッシュしてしまう。
fatal error: unexpectedly found nil while unwrapping an Optional value

Demo-5.swift
var text: String?

text = "foobar"
// !を付けて、強制アンラップして、Stringとして使用
let newText1 = "[new]" + text!
print(newText1) // [new]foobar

text = nil
// !を付けて、強制アンラップして、Stringとして使用
let newText2 = "[new]" + text!
print(newText2) // クラッシュ

クラッシュはまずいので、基本的に使わない方が良いと思います。

unwrap2. Nil Coalescing Operator

もし、nilだったらデフォルト値を入れる。
??という演算子を使用する。

Demo-6.swift
/// nameプロパティだけを持つ単純なクラス
final class Man {
    // Optional Type
    static var name: String?
}

final class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 定義するnameは、String型
        // Man.nameがnilだった場合は、"unknown"が入る
        let name = Man.name ?? "unknown"
        print(name)
    }
}

unwrap3. Optional Binding

もし、nilではなかったら、処理をする。
nil判定と、定数化を一緒にしてくれるイメージです。

Demo-7.swift
var array: [String] = ["a", "b", "c", "d", "e"]

// array.firstがnilでなければ、firstElementを定義してifブロック内の処理を実行
if let firstElement = array.first {
    // firstElementは、このifブロック内でのみ有効
    print("firstElement is \"\(firstElement)\"")
}

print("count: \(array.count)")

unwrap4. Optional Chaining

もし、nilではなかったら、そのプロパティやメソッドにアクセスする。
Optional Chainingの呼び出し結果はOptional Typeになる。
そのため、上記のNil Coalescing OperatorやOptional Bindingを併せて使用します。

Demo-8.swift
var count: Int? = 0

// textがnilの場合はnilが返却される
// textがnilでない場合は文字数が返却される(Optional Type)
count = textField.text?.characters.count
Demo-9.swift
// Nil Coalescing Operatorを使用する場合
let count = textField.text?.characters.count ?? 0
print(count)
Demo-10.swift
// Optional Bindingを使用する場合
if let count = textField.text?.characters.count {
    print(count)
}

unwrap5. Guard Statement

もし、nilだったらその場で処理を終了する。(早期リターンする)

Demo-11.swift
func outputWomanName(woman: Woman?) -> Bool {

    // womanがnilの場合は早期リターンする
    guard let woman = woman else {
        return false
    }

    // womanがnilでない場合はunwrapしたwomanを使用できる
    print("name: \(woman.name)")
    return true
}

Implicitly Unwrapped Optional

Optional Typeの操作ではなく、のひとつとしてImplicitly Unwrapped Optionalがあります。

暗黙的にForced Unwrappingが行われる。
Forced Unwrappingと同様にnilだった場合は、クラッシュしてしまう。
fatal error: unexpectedly found nil while unwrapping an Optional value

Demo-12.swift
var str: String! = "foo"
print(str)

str = nil
print(str) // クラッシュ

クラッシュはまずいので、Forced Unwrappingと同様にこちらも基本的に使わない方が良いと思います。

さいごに

今回は、
・変数と定数
・型推論
・Optional Type (オプショナル型)
について纏めました。
どんどん追加・更新していきたいです。

y-okudera
ぼのぼの。 アカウント名をGitHubに合わせました!(旧アカウント名: @okuderap)
andfactory
Smartphone Idea Companyとして、人々の生活に「&(アンド)」を届ける。
https://andfactory.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away