Day 12 Swift语法-进阶篇(5/5)-Extension

昨天提到了protocol,今天我们就学习一下extenison的用法,昨天我们可以透协定去规范我们的struct或者class等等,我们可以透过将protocol跟extension的结合,去实现swift里面原本不能做到的事情譬如整数跟小数相除。

import UIKit

protocol Number {
    var doubleValue: Double { get } 
}


extension Double: Number {
    var doubleValue: Double {
        return self
    }
}



extension Int: Number {
    var doubleValue: Double {
        return Double(self)
    }
}

func *(lhs: Number, rhs: Number) -> Double {   //乘法
    return lhs.doubleValue * rhs.doubleValue
}

 func /(lhs: Number, rhs: Number) -> Double {   //除法
    return lhs.doubleValue / rhs.doubleValue
}

let floatNumber: Double = 5.5
let doubleNumber: Int = 2
let resultNumber = floatNumber / doubleNumber
print(resultNumber)

当然你如果你的型态是其他的话,我们只需要新增额外的extension,譬如你的型态是float

extension Float: Number {
    var doubleValue: Double {
        return Double(self)
    }
}

或是你要做加法除法

func +(lhs: Number, rhs: Number) -> Double {   //加法
   return lhs.doubleValue + rhs.doubleValue
}

func -(lhs: Number, rhs: Number) -> Double {   //减法
   return lhs.doubleValue - rhs.doubleValue
}

当然我们也可以结合之前的protocol

protocol ShowID {
    func showId()
}

extension  ShowID {
    func showId () {
        print("1234")
    }
}

protocol ShowUserName {
    func showUserName()
}

extension ShowUserName {
    func showUserName()  {
        print("allen")
    }
}

class User1: ShowID ,ShowUserName { }


let allen = User1()

allen.showUserName()
allen.showId()

我们可以让class去继承上面的protocol,再透过extenison的方法,写说我们协定要干嘛,这样做的原因是,我的类别可能需要继承两个父类别,但是我们没办法做到同时继承两个父类别,我就可以透过使用extension的方式去实现它


<<:  [iT铁人赛Day24]练习题(3)

>>:  Day-10:资料验证系虾米哇贵!?

0 day 安全笔记 第二章 基本知识 下

OS:XP SP3 编译器: DEV C++ 4.9.9.2 工具: OD (ollydbg) 大家...

Apple Music vs Spotify 优缺点比较:哪个更好?

我们将从价格、曲库、音质、歌词方面比较 Spotify 和 Apple Music,让你可以一次了解...

【设计+切版30天实作】|Day1 - 开赛宣言

前言 在开赛前,先来做个小小的自我介绍好了!目前是火箭队的网页设计组,加入火箭队前有上过六角学院的U...

24. 借助你的特权来帮助他人

前言 几十年前,演出星际迷航记(Star Trek)里Leonard Nimoy(饰演Spock)...

Day18-D3 的 Axis( ) & ticks( ) 轴线与刻度

本篇大纲:轴线的组成、建立轴线的必备工具、绘制轴线的API、ticks 刻度、XY 轴范例 讲了好...