Swift基礎Part4 クラス定義


クラス定義の基本

まずはインスタンスフィールドとインスタンスメソッドがあるベーシックなもの

class Book{
    var title:String="" 
    var isbn:String?
    
    func getString() -> String { 
        return title+":"+isbn!
    }
}

//インスタンス化して使ってみる
let instance:Book=Book()
instance.title="Perfect Swift"
instance.isbn="123456789"
print(instance.getString())

static系のメソッドとフィールドは以下のように定義します


class Greet{
    static let msg:String="Hello,static message!" //static フィールドの宣言
    
    class func sayHello(msg:String){ //staticメソッド
        print("Hello,"+msg+"!!");
    }
    
}

print(Greet.msg)
Greet.sayHello("developer")

willSet,didSet

インスタンスフィールドに値をセットする直前・直後にメソッドを呼び出したい時、willSetとdidSetという構文を使うことで実現できます。

class Flipper{
    var val:Int=0{
        willSet{
            print("新しく代入しようとしている数は(newValue)です")
        }
        didSet{
            if(oldValue%2==0){
                print("古い数は偶数でした")
            }else{
                print("古い数は奇数でした")
            }
        }
    }
    
    
}

let filpper:Flipper=Flipper()
filpper.val=1
filpper.val=2

これは他の言語ではあまり見ない書き方ですね。しっかり覚えよっと。

コンストラクタ、デストラクタ

コンストラクタはinitで定義します。また、convinience initと書くことで、他のinitを呼び出すことができます。
また、自分自身を指す変数はSwiftではselfです。

class Book{
    var title:String="" 
    var isbn:String?
    
    func getString() -> String { 
        return title+":"+isbn!
    }
    
    init(title:String,isbn:String?){ //コンストラクタ
        self.title=title
        self.isbn=isbn
    }
    
    convenience init(){
        self.init(title:"NoTitleBook",isbn:nil)
    }
    
    deinit{
        print("インスタンスが破棄されました") //デストラクタ
    }
    
}

最近の言語はデストラクタがないものが多いですが、Swiftにはデストラクタがあります。

継承

オブジェクト指向おなじみ、かつTemplate Method以外ではあまり使われない継承。


class Parent{
    
    var parentProp:String=""
    
    init(str:String){
        self.parentProp=str
    }
    
    func sayHello(){
        print("Hello!")
    }
    
    func sayWelcome(){
        print("Please override me")
    }
}

class Child:Parent{
    
    var childProp:String=""
    
    init(str1:String,str2:String){
        super.init(str:str1)
        self.childProp=str2
    }
    
    func sayHi(){
        print("Hi")
    }
    //親クラスのsayWelcomeをオーバーライド
    override func sayWelcome() {
        print("successfully override!")
        print("(self.parentProp):(self.childProp)")
    }
    
}


var child:Child=Child(str1:"ParentProp",str2:"ChildProp")
child.sayHello()
child.sayHi()
child.sayWelcome()

以上、クラス構文に関する簡単なまとめでした。

私は、この本を使って勉強しています。