型・クラスのカスタマイズ
型やクラスをカスタマイズすることで、コーディングがかなり楽になるので、その方法について書いていこうと思います。
その便利な機能こそが、題にものってますが、継承と拡張です!
それぞれ簡単に説明すると
継承:親クラスを基につくる。親クラスのプロパティやメソッドを引き継ぐ
拡張:今ある、クラスや型に新たな機能を追加(拡張)する
継承
//親クラス
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:"")
}
}