Swift Extension擴(kuò)展得使用詳細(xì)介紹
擴(kuò)展(Extension)
1、Swift中的擴(kuò)展,有點(diǎn)類似于OC中的分類(Category)
2、擴(kuò)展可以為枚舉、結(jié)構(gòu)體、類、協(xié)議添加新功能
可以添加方法、計(jì)算屬性、下標(biāo)、(便捷)初始化器、嵌套類型、協(xié)議等等
3、擴(kuò)展不能辦到的事情
不能覆蓋原有的功能
不能添加存儲(chǔ)屬性,不能向已有的屬性添加屬性觀察器
不能添加父類
不能添加指定初始化器,不能添加反初始化器
。。。。
extension Double {
var km: Double {
self * 1_000.0
}
var m: Double {
self
}
var dm: Double {
self / 100.0
}
var cm: Double {
self / 10.0
}
var mm: Double {
self / 1_000.0
}
}
var d = 100.0
d.km
d.m
d.dmvar arr: Array<Int> = [10, 20, 30]
extension Array {
subscript(nullable idx: Int) -> Element? {
if (startIndex ..< endIndex).contains(idx) {
return self[idx]
}
return nil
}
}
print(arr[nullable: 1] ?? 0)extension Int {
func repeats(task: () -> Void) {
for _ in 0..<self {
task()
}
}
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0: return .zero
case let x where x > 0: return.positive
default: return .negative
}
}
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}協(xié)議與初始化器
class Person {
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
}
extension Person: Equatable {
static func == (left: Person, right: Person) -> Bool {
left.age == right.age && left.name == right.name
}
convenience init() {
self.init(age: 0, name: "")
}
}1、如果希望自定義初始化器的同時(shí),編譯器也能夠生成默認(rèn)初始化器,那么可以在擴(kuò)展中編寫自定義初始化器
struct Point {
var x: Int = 0
var y: Int = 0
}
extension Point {
init(_ point: Point) {
self.init(x: point.x, y: point.y)
}
}2、required初始化器不能寫在擴(kuò)展中
協(xié)議
1、如果一個(gè)類型已經(jīng)實(shí)現(xiàn)了協(xié)議的所有要求,但是還沒有聲明它遵守了這個(gè)協(xié)議
可以通過擴(kuò)展來讓它遵守這個(gè)協(xié)議
2、給協(xié)議進(jìn)行擴(kuò)展后,凡是遵守了這個(gè)協(xié)議的都會(huì)有對應(yīng)的擴(kuò)展方法,以下面為例,編寫一個(gè)函數(shù),判斷一個(gè)證書是否為奇數(shù)。
extension BinaryInteger {
func isOdd() -> Bool {
self % 2 != 0
}
}3、擴(kuò)展可以給協(xié)議提供默認(rèn)實(shí)現(xiàn),也間接實(shí)現(xiàn) 可選協(xié)議 的效果
protocol TestProtocol {
func test1()
}
extension TestProtocol {
func test1() {
print("TestProtocol test1")
}
func test2() {
print("TestProtocol test2")
}
}
class TestClass: TestProtocol {
func test1() {
print("TestClass test1")
}
func test2() {
print("TestClass test2")
}
}
var cls: TestProtocol = TestClass()
cls.test1() //TestClass test1
cls.test2() //TestProtocol test2泛型
1、擴(kuò)展中依然可以使用原類型中的泛型類型
2、符合條件才擴(kuò)展
extension Stack: Equatable where E: Equatable {
}到此這篇關(guān)于Swift Extension擴(kuò)展得使用詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Swift Extension內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swift Access Control訪問控制與斷言詳細(xì)介紹
這篇文章主要介紹了Swift Access Control訪問控制與斷言,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解
這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下2015-01-01
在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法
這篇文章主要介紹了在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼的方法,在一個(gè)工程中同時(shí)使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下2014-07-07
Swift版使用ThPullRefresh實(shí)現(xiàn)下拉上拉刷新數(shù)據(jù)
這篇文章主要介紹了Swift版使用ThPullRefresh實(shí)現(xiàn)下拉上拉刷新數(shù)據(jù),需要的朋友可以參考下2016-01-01

