辞書(Dictionary)
宣言&初期化
var 変数 = [キー1: 値1, キー2: 値2]
- 型を明記する場合は
let 変数:[キーの型: 値の型] = [キー1: 値1, キー2: 値2]
- 空のDictionaryの作成は
let 変数:[キーの型: 値の型] = [:]
- letで宣言すると要素の追加・削除ができない
(JavaScriptの場合はconstで宣言しても要素の追加・削除ができるが、Swiftのletの場合は追加・削除ができないので注意)
キー指定で要素削除
変数.removeValue(forKey: キー)
全要素削除
変数.removeAll()
// 宣言&初期化
var dic = ["spple": 200, "lemmon": 500, "orange": 350]
// キー指定で要素削除
dic.removeValue(forKey: "lemmon")
print(dic) // ["orange": 350, "spple": 200]
// 全要素削除
dic.removeAll()
print(dic) // [:]
関数
関数定義
func 関数名(引数1: データ型, 引数2: データ型) -> 戻り値の型 {
// 処理
}
func add(num1: Int, num2: Int) -> Int {
return num1 + num2
}
print(add(num1:3, num2:4)) // 7
関数ラベル
引数名を省略して呼び出せるようにする場合は、引数名の前に「_
」を置く。 func 関数名(_ 引数1: データ型, _ 引数2: データ型) -> 戻り値の型 {
// 処理
}
func add(_ num1: Int, _ num2: Int) -> Int {
return num1 + num2
}
print(add(3, 4))
厳密には、関数の引数には引数名の他に分かりやすいラベル(関数ラベル)をつけることができる。
※関数ラベルをアンダースコアにすると省略可能となる
func add(a num1: Int, b num2: Int) -> Int {
return num1 + num2
}
print(add(a:3, b:4))
guard文
guard文とは
条件式がfalseの場合に関数から抜けるための構文。
if文でも同じ処理を書くことができるが、可読性が上がるのでguard文を使うべき。guard 条件式 else {
// 処理
return または break または throw
}
※elseブロックの中にreturn、break、throwのいずれかを記述しないとエラーになる
func hoge(_ num: Int)->Int {
guard num > 100 else {
return 100
}
return num
}
print(hoge(500)) // 100
オプショナルバインディング
オプショナル型の変数をアンラップする際に、以下の形のguard文がよく使われれる。
guard文を使うことでnilチェックとアンラップを同時に行うことができる。guard let 変数 = オプショナル else {
// nilだった場合の処理
return または break または throw
}
func hoge(_ num: Int?)->Int {
guard let num2 = num else {
return 0
}
return num2
}
print(hoge(nil)) // 0
defer文
関数(厳密言うとスコープ)を抜ける前に必ず実行したい処理を定義することができる。defer {
// 処理
}
※defer文の前にbreakやreturnなどで処理を抜けてしまうと実行されないの注意
func hoge(_ num: Int)->Int {
defer {
print("hoge終了")
}
guard num <= 100 else {
return 0
}
return num
}
print(hoge(100)) // hoge終了 100
print(hoge(101)) // hoge終了 0
クラス
クラスの定義
class クラス名 {
// プロパティの定義
// イニシャライザの定義
// メソッドの定義
}
※イニシャライザの定義は「名前がinitでfuncキーワードと戻り値を記述しない」関数の定義
※プロパティやメソッドへのアクセスはself.プロパティ名、self.メソッド名()
インスタンス化
var 変数 = クラス名()
class Person {
var name = ""
init(name: String) {
self.name = name
}
func getName() -> String {
return self.name
}
}
var person = Person(name: "hoge")
print(person.getName()) // hoge
print(type(of: person)) // Person
オーバーロード
他のプログラミング言語と同じように、関数やイニシャライザはオーバーロードすることができる。
class Person {
var name = ""
init() {
self.name = "no name"
}
init(name: String) {
self.name = name
}
func getName() -> String {
return self.name
}
}
var person = Person()
print(person1.getName()) // no name
計算型プロパティ(Computed Properties)
値を保持せずに、他のプロパティからの計算によって値を取得・設定するプロパティ。
var プロパティ名: データ型 {
get {
// 処理
}
set {
// 処理
}
}
※set内ではnewVlaueという名前の変数から値を取得することができる
※letで宣言した変数にインスタンスを代入すると、セッターによる値の代入ができなくなるので注意
class Person {
var _name = ""
var name: String {
get {
if (self._name == "") {
return "名無し"
}
return self._name
}
set {
self._name = newValue
}
}
}
var person = Person()
print(person.name) // 名無し
person.name = "hoge"
print(person.name) // hoge
プロパティ監視
値設定の前後に行う処理を定義することができる。
計算型プロパティは値を保持しないが、プロパティ監視は値を保持する。
var プロパティ名: データ型 = 初期値 {
willSet {
// 処理
}
didSet {
// 処理
}
}
※willSet内ではnewVlaueという名前の変数から値を取得することができる
※didSet内ではoldVlaueという名前の変数から値を取得することができる
※イニシャライザからの変更時はプロパティ監視は呼び出されない
class Person {
var name: String = "" {
willSet {
print("willSet from:\(self.name) to:\(newValue)")
}
didSet {
print("didSet from:\(oldValue) to:\(self.name)")
}
}
init(name: String) {
self.name = name
}
}
var person = Person(name: "hoge")
print(person.name) // hoge
person.name = "hoge2" // willSet from:hoge to:hoge2\n didSet from:hoge to:hoge2
print(person.name) // hoge2
継承
class クラス名:親クラス名 {
// クラス定義
}
※関数やイニシャライザをオーバーライドする場合はoverrideキーワード付ける
class Oya {
var num = 1
}
class Ko:Oya {
override init() {
super.init()
print(self.num)
}
init(num: Int) {
super.init()
self.num = num
print(self.num)
}
}
var ko = Ko()
var ko2 = Ko(num:2)