Swift typealias 和泛型介面

2021-10-22 09:20:15 字數 3097 閱讀 5205

typealias是用來為已經存在的型別重新定義名字的,通過命名,可以使**變得更加清晰。使用的語法也很簡單,使用typealias關鍵字像使用普通的賦值語句一樣,可以將某個已經存在的型別賦值為新名字

比如在計算二維平面上的距離和位置的時候,我們一般使用double來表示距離,用cgpoint來表示位置:

func

distancebetweenpoint

(point:

cgpoint

, topoint:

cgpoint)-

>

double

let origin =

cgpoint

(x:0

, y:0)

let point =

cgpoint

.init

(x:1

, y:1)

letdistance

=distancebetweenpoint

(point: origin, topoint: point)

print

(distance

)// 1.4142135623730951

雖然在數學上和最後的程式執行上都沒什麼問題,但是閱讀和維護的時候總是覺得有**不對。因為我們沒有將數學抽象和實際問題結合起來,使得在閱讀**時我們還需要在大腦中進行一次額外的轉換:cgpoint代表乙個,而這個點就是在定義的座標系裡的位置double是乙個數字,它代表兩個點之間的距離

typealias

location

=cgpoint

typealias

distance

=double

func

distancebetweenpoint

(point:

location

, topoint:

location)-

>

distance

let origin =

location

(x:0

, y:0)

let point =

location

.init

(x:1

, y:1)

letdistance

:distance

=distancebetweenpoint

(point: origin, topoint: point)

print

(distance

)

同樣的**,在typealias的幫助下,讀起來輕鬆多了。可能只憑這個簡單例子不會給人特別多的體會,但是當遇到複雜的實際問題時,你不再關心並去對映自己**裡那些成堆int或者string這些基本型別到底代表的是什麼,會省下不少」腦細胞「

對於普通型別並沒有什麼難點,但是在涉及泛型時,情況就不太一樣。首先,typealias單一的,也就是說你必須指定將某個特定的型別通過typealias賦值新名字,而不能將整個泛型進行重新命名。請看下面的命名方式:

class

person

typealias

worker

=person

// 可以通過編譯

typealias

worker

=person

// cannot find type 't' in scope

typealias

worker

=person

// invalid redeclaration of 'worker'

一旦泛型型別的確定性得到保證後,我們就可以重新命名了:

class

person

typealias

workerid

=string

typealias

worker

=person

<

workerid

>

另乙個值得一提的是swift中是沒有泛型介面的,但是使用associatedtype,我們可以在介面裡定義乙個必須實現別名,這在一定範圍內也算一種折中方案。比如在expressiblebyunicodescalarliteral介面中,swift就用到了這個技巧,來為介面確定乙個使用的類似泛型的特性:

public

protocol

expressiblebyunicodescalarliteral

在實現這些介面時,我們不僅需要實現指定的方法,還要實現對應的typealias,這其實是一種對於介面適用範圍抽象約束

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...

if和switch和for語句

if和switch很像。具體什麼場景下,應用那個語句呢?如果判斷的具體數值不多,而是符合byte,short,int,char,字串。這五種型別。雖然兩個語句都可以使用,建議使用switch語句,因為效率稍高。其他情況,對區間判斷,對結果為boolean型別判斷,使用if,if的使用範圍更廣。whi...