この記事は公開されてから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からの変更点)
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|WWDC2016 とSwift 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のコードが読めるようになる?のではと思います。