協議程式設計 Swift中,值型別優先於類

2021-10-05 11:45:52 字數 3108 閱讀 9436

import uikit

import foundation

/面向協議程式設計

*****/

/// pop就是通過協議擴充套件,協議繼承和協議組合的方式來設計需要編寫的**

/// 協議擴充套件 protocol extensions

/// 協議繼承

/// 協議組合

/// swift中,值型別優先於類,值型別可以從協議繼承,設定支援從多個協議繼承,因此,使用pop讓值型別成為了swift中的一等公民

/// protocol extensions

/// 提供協議方法的預設實現和協議屬性的預設值,從而使它們成為可選;符合協議的型別可以提供自己的實現,也可以使用預設的實現。

/// 新增協議中未宣告的附加方法實現,並且實現協議的任何型別都可以使用到這些附加方法。這樣就可以給遵循協議的型別新增特定的方法。

protocol entity

static func uid() -> string

}extension entity

}struct order: entity

let order = order(name: 「my order」)

print(order.uid)

/// protocol inheritance

/// 協議可以從其他協議繼承,然後在它繼承的需求之上新增功能,因此可以提供更細粒度和更靈活的設計。

protocol persistable: entity

struct inmemoryentity: entity

struct persistableentity: persistable

init?(by uid: string) 

var name: string

/// protocol composition

/// 類、結構體和列舉可以符合多個協議,它們可以採用多個協議的預設實現。這在概念上類似於多繼承。這種組合的方式不僅比將所有需要的功能壓縮到乙個基類中更靈活,而且也適用於值型別

struct myentity: entity, equatable, customstringconvertible

/// equatable

/// lhs:left hand side

/// rhs:right hand side

public static func == (lhs: myentity, rhs: myentity) -> bool

var name: string

let entity1 = myentity(name: 「42」)

print(entity1)

let entity2 = myentity(name: 「42」)

assert(entity1 == entity2, 「entities shall be equal」)

protocol theprotocol

extension theprotocol

/// extention新增協議中未宣告的附加方法實現

/// method2 is not defined in protocol

func method2()

}struct struct1: theprotocol

/// 動態型別實現 method2

func method2()

}/// 推斷型別為 動態型別 執行動態型別實現方法

let s1 = struct1()

s1.method1()

s1.method2()

print("\n-----------------\n")

/// 推斷型別為 協議型別

let s2: theprotocol = struct1()

/// method1 在協議中有定義 呼叫struct1的動態型別實現方法

s2.method1()

/// method2 在協議中無定義 在extention的實現 呼叫theprotocol的extention預設實現方法

s2.method2()

print("\n-----------------\n")

/*called method1 from struct1

called method2 from struct1

called method1 from struct1

called method2 from theprotocol

/*protocol 基礎語法

屬性要求 :

:指定讀寫屬性

static/class:指定型別屬性

方法要求:

static/class:指定類方法

mutating:要求實現可變方法(針對值型別的例項方法,可以在該方法中修改它所屬的例項以及例項的任意屬性的值)

構造器要求:

在遵循協議的類中,必須使用required關鍵字修飾,保證其子類也必須提供該構造器的實現。(除非有final修飾的類,可以不用required,因為不會再有子類)

protocol 作為型別

作為型別:代表遵循了該協議的某個例項(實際上就是某個例項遵循了協議)

協議型別的集合:let a: [someprotocol],遵守某個協議的例項的集合

delegate 委託設計模式:定義協議來封裝那些需要被委託的功能

protocol 間的關係

協議的繼承:協議可繼承

協議的合成:使用&關鍵字,同時遵循多個協議

協議的一致性:使用is、as?、as!進行一致性檢查

類專屬協議:協議繼承時使用class關鍵字,限制該協議職能被類繼承

optional & @objc 關鍵字

可選協議:使用optional修飾屬性、函式、協議本身,同時所有option必須被@objc修飾,協議本身也必須使用@objc,只能被objective-c的類或者@objc的類使用

extension 關鍵字

(對例項使用)令已有型別遵循某個協議

(對協議使用)可遵循其他協議,增加協議一致性

(對協議使用)提供預設實現

(搭配where對協議使用)增加限制條件

*/

Swift中值型別賦值操作

值型別賦值給var let或者給函式傳參,是直接將所有內容拷貝乙份,類似於對檔案進行copy paste操作,產生了全新的檔案副本。屬於深拷貝 deep copy 在swift標準庫中,為了提公升效能,string array dictionary set採取了copy on write的技術。比如...

Swift 面向協議程式設計入門

本文講的是swift 面向協議程式設計入門,class humanclass var classyhuman humanclass name bob classyhuman.name bob var newclassyhuman classyhuman created a copied object...

Swift 面向協議程式設計之協議擴充套件

協議的命名遵循swift的標準庫,即協議名以 type able ible 結尾。例如 sequencetype,generatortype,customstringcoveeertible,type定義行為,able定義元素怎樣做事。swift 能擴充套件協議 協議可以新增方法和屬性 協議擴充套件...