個人メモです。
もし間違いがあれば指摘いただけると助かります。
メソッド
クラスだけでなく構造体や列挙型にもメソッドを持たせることができる
/* 動物 */
enum Pet {
case Cat, Dog, Bird
func japaneaseName() -> String {
switch self {
case .Cat:
return "猫"
case .Dog:
return "犬"
case .Bird:
return "鳥"
}
}
}
/* ファミリー */
class Family {
var familyNumber: Int
var pet: Pet
init(familyNumber: Int, pet: Pet) {
self.familyNumber = familyNumber
self.pet = pet
}
func getAllMember() -> String {
return "家族が\(familyNumber)人と、ペットに\(pet.japaneaseName())がいます。"
}
}
// 呼び出し
let family = Family(familyNumber: 4, pet: .Bird)
print(family.getAllMember())
いろんなメソッドの制約
- メソッドに引数をもつと、第二引数以降は関数と同じようにラベルが必要になる
第一引数には不要だが、つける場合は引数名の前に「#」をつける- swift2.xから#は廃止
- また、swift3.0からは第一引数も第二引数以降と同様にラベルをつけて呼び出すようになる
- 第二引数以降のラベルも関数と同じように「_」で省略できる
破壊的メソッド
- 構造体、列挙型のメソッドはプロパティを変更することはできない
- mutatingをfuncの前につけて宣言することで属性値を変更できる
- 定数の構造体、列挙型ではmutatingメソッドを呼び出すことはできない
- クラスの場合は変更可能
型メソッド
- クラスや構造体のインスタンスではなく型自体に属するメソッド
- プロパティと同じように構造体と列挙型はstatic
- 呼び出すときは型.メソッド形式で呼び出す
- staticメソッドからはstaticプロパティに直接アクセスできる
列挙型
/* 鳴き声 */
enum Animal {
case Cat, Dog, Mouse
static func cry(animal: Animal) -> String {
switch animal {
case .Cat:
return "meow"
case .Dog:
return "Bow-wow"
case .Mouse:
return "squeak"
}
}
}
print(Animal.cry(Animal.Dog))
クラス
/* 本クラス */
class Book {
static var bookName: String = "Swift"
static func getBookName() -> String {
return "この本の名前は\(bookName)です"
}
var price: Int
init(price: Int) {
self.price = price
}
}
print(Book.getBookName())