LoginSignup
6
5

More than 3 years have passed since last update.

【Swift】継承と拡張

Posted at

型・クラスのカスタマイズ

型やクラスをカスタマイズすることで、コーディングがかなり楽になるので、その方法について書いていこうと思います。

その便利な機能こそが、題にものってますが、継承と拡張です!
それぞれ簡単に説明すると

継承:親クラスを基につくる。親クラスのプロパティやメソッドを引き継ぐ
拡張:今ある、クラスや型に新たな機能を追加(拡張)する

継承

//親クラス
class parent:NSObject{

    func date(){
        print(Date())
    }

}
//サブクラス
class child: parent{
    override func date() {
        //親クラスのメソッドを呼ぶ
        super.date()
        //1分前の日時を出力
        print(Date(timeInterval: -60, since:Date()))
    }
}

//サブクラスのインスタンス
let calender = child()
calender.date()
出力
//親クラスの処理
2020-04-18 06:20:59 +0000
//サブクラスの処理
2020-04-18 06:19:59 +0000

Point
overrideで親クラスのメソッドにアクセスし、super.メソッドで呼び出す

拡張(extension)

エクステンションの実装には、いくつか種類があります!

  • 計算型メソッド
  • イニシャライザ
  • メソッド
  • サブスクリプト
  • ネスト型

計算型メソッド

//計算型プロパティ

//Int型に拡張
extension Int {
    //2倍
    var twice:Int{
        return self*2
    }
    //3倍
    var triple:Int{
        return self*3
    }
    //2乗
    var sqaure:Double{
        return pow(Double(self),2)
    }
}

let num:Int = 24
print(num.twice)
print(num.triple)
print(num.sqaure)

//クラスに拡張
extension NSObject{
    class var className:String{
        return String(describing: self)
    }
    var className:String{
        return self.className
    }
}

イニシャライザ

イニシャライザは、元々型やクラスに実装されています。
それとは別に自由にイニシャライザを追加できます!


//イニシャライザ
extension CGRect{
    //中心材表とサイズからCGRectのインスタンスを作る
    init(center:CGPoint,size:CGSize){
        let originX = center.x - (size.width/2)
        let originY = center.y - (size.height/2)
        self.init(origin: CGPoint(x: originX,y:originY), size:size)
    }
}

let centerRect = CGRect(center: CGPoint(x:4.0,y:4.0), size: CGSize(width: 4.0, height: 4.0))

メソッド

//メソッド
extension Int {

    func rep(task:() -> Void){
        for _ in 0..<self{
            task()
        }
    }
}
3.rep{
    print("Hello,world")
}

サブスクリプト

配列で使われる[]を用います。


//サブスクリプト
extension String{
    //サブスクリプトを使う際のメソッドを見やすくするため関数化
    //indexで指定した桁数を返す
    func id(index:Int)->Index{
        return self.index(self.startIndex, offsetBy: index)
    }

    //サブスクリプトの指定。idのメソッドを読んでいる。
    subscript(index: Int) -> String {
        return String(self[id(index: index)])
    }
}

let hello:String = "Hello, world"
print(hello[3])

出力
l

ネスト型

内部に列挙型の定義をおこない、処理を作ることが可能です。

extension Int{
    //enumの定義
    enum Kind {
        case negative, zero, positive
    }

    //Int型の種類を判別する処理
    var kind: Kind{
        switch self{
        case 0:
            return .zero
        case let x where x>0:
            return .positive
        default:
            return .negative
        }
    }
}

let numbers : [Int] = [0,1,-1,2,-2,100,-100,0]
for number in numbers{
    switch number.kind {
    case .negative:
        print("- ", terminator:"")
    case .positive:
        print("+ ", terminator:"")
    case .zero:
        print("0 ", terminator:"")
    }
}
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5