泛型

泛型(Generics)

  • 泛型可以將類型參數(shù)化,提高代碼復(fù)用率资柔,減少代碼量
func swapValues<T>(_ a: inout T, _ b: inout T) {
    (a, b) = (b, a)
}
var i1 = 10
var i2 = 10
swapValues(&i1, &i2)

var d1 = 10.0
var d2 = 20.0
swapValues(&d1, &d2)

struct Date {
    var year = 0, month = 0, day = 0
}
var dd1 = Date(year: 2011, month: 9, day: 10)
var dd2 = Date(year: 2012, month: 10, day: 11)
swapValues(&dd1, &dd2)
  • 泛型函數(shù)賦值給變量
func test<T1, T2>(_ t1: T1, _ t2: T2) {}
var fn: (Int, Double) -> () = test
class Stack<E> {
    var elements = [E]()
    func push(_ element: E) { elements.append(element) }
    func pop() -> E { elements.removeLast() }
    func top() -> E { elements.last! }
    func size() -> Int { elements.count }
}
class SubStack<E>: Stack<E> {}
struct Stack<E> {
    var elements = [E]()
    mutating func push(_ element: E) { elements.append(element) }
    mutating func pop() -> E { elements.removeLast() }
    func top() -> E { elements.last! }
    func size() -> Int { elements.count }
}
var stack = Stack<Int>()
stack.push(11)
stack.push(22)
stack.push(33)
print(stack.top()) // 33
print(stack.pop()) // 33
print(stack.pop()) // 22
print(stack.pop()) // 11
print(stack.size()) // 0
enum Score<T> {
    case point(T)
    case grade(String)
}
let score0 = Score<Int>.point(100)
let score1 = Score.point(99)
let score2 = Score.point(99.5)
let score3 = Score<Int>.grade("A")

關(guān)聯(lián)類型(Associated Type)

  • 關(guān)聯(lián)類型的作用:給協(xié)議中用到的類型定義一個占位名稱
  • 協(xié)議中可以擁有多個關(guān)聯(lián)類型
protocol Stackable {
    associatedtype Element // 關(guān)聯(lián)類型
    mutating func push(_ element: Element)
    mutating func pop() -> Element
    func top() -> Element
    func size() -> Int
}
class Stack<E>: Stackable {
//    typealias Element = E
    var elements = [E]()
    func push(_ element: E) {
        elements.append(element)
    }
    func pop() -> E { elements.removeLast() }
    func top() -> E { elements.last! }
    func size() -> Int { elements.count }
}
class StringStack: Stackable {
    // 給關(guān)聯(lián)類型設(shè)定真實類型
//    typealias Element = String
    var elements = [String]()
    func push(_ element: String) { elements.append(element) }
    func pop() -> String { elements.removeLast() }
    func top() -> String { elements.last! }
    func size() -> Int { elements.count }
}
var ss = StringStack()
ss.push("Jack")
ss.push("Rose")

類型約束

protocol Runnable { }
class Person { }
func swapValues<T: Person & Runnable>(_ a: inout T, _ b: inout T) {
    (a, b) = (b, a)
}
protocol Stackable {
    associatedtype Element: Equatable
}
class Stack<E : Equatable> : Stackable  { typealias Element = E }
func equal<S1: Stackable, S2: Stackable>(_ s1: S1, _ s2: S2) -> Bool
    where S1.Element == S2.Element, S1.Element : Hashable {
    return false
 }
var stack1 = Stack<Int>()
var stack2 = Stack<String>()
// error: Global function 'equal' requires the types 'Int' and 'String' be equivalent
equal(stack1, stack2)

協(xié)議類型的注意點

protocol Runnable {}
class Person: Runnable {}
class Car: Runnable{}

func get(_ type: Int) -> Runnable {
    if type == 0 {
        return Person()
    }
    return Car()
}

var r1 = get(0)
var r2 = get(1)
  • 如果協(xié)議中有associatedtype
protocol Runnable {
    associatedtype Speed
    var speed: Speed { get }
}
class Person: Runnable {
    var speed: Double { 0.0 }
}
class Car: Runnable {
    var speed: Int { 0 }
}

泛型解決

  • 解決方案①:使用泛型
func get<T : Runnable>(_ type: Int) -> T {
    if type == 0 {
        return Person() as! T
    }
    return Car() as! T
}
var r1: Person = get(0)
var r2: Car = get(1)

不透明類型(Opaque Type)

  • 解決方案②:使用some關(guān)鍵字聲明一個不透明類型
func get(_ type: Int) -> some Runnable { Car() }
var r1 = get(0)
var r2 = get(1)
  • some限制只能返回一種類型
func get(_ type: Int) -> some Runnable {
    if type == 0 {
        return Person()
    }
    return Car()
}

some

  • some除了用在返回值類型上介粘,一般還可以用在屬性類型上
protocol Runnable { associatedtype Speed }
class Dog: Runnable { typealias Speed = Double }
class Person {
    var pet: some Runnable {
        return Dog()
    }
}

可選項的本質(zhì)

  • 可選項的本質(zhì)是enum類型
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
}
var age: Int? = 10
var age0: Optional<Int> = Optional<Int>.some(10)
var age1: Optional = .some(10)
var age2 = Optional.some(10)
var age3 = Optional(10)
age = nil
age3 = .none
var age: Int? = nil
var age0 = Optional<Int>.none
var age1: Optional<Int> = .none
var age: Int? = .none
age = 10
age = .some(20)
age = nil
switch age {
case let .some(v):
    print("some", v)
case .none:
    print("none")
}

可選項的本質(zhì)

var age_: Int? = 10
var age: Int?? = age_
age = nil

var age0 = Optional.some(Optional.some(10))
age0 = .none
var age1: Optional<Optional> = .some(.some(10))
age1 = .none
var age: Int?? = 10
var age0: Optional<Optional> = 10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锈至,一起剝皮案震驚了整個濱河市附井,隨后出現(xiàn)的幾起案子部脚,更是在濱河造成了極大的恐慌想邦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件委刘,死亡現(xiàn)場離奇詭異丧没,居然都是意外死亡鹰椒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門呕童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漆际,“玉大人,你說我怎么就攤上這事夺饲〖榛悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵往声,是天一觀的道長擂找。 經(jīng)常有香客問我,道長浩销,這世上最難降的妖魔是什么贯涎? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮慢洋,結(jié)果婚禮上柬采,老公的妹妹穿的比我還像新娘。我一直安慰自己且警,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布礁遣。 她就那樣靜靜地躺著斑芜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祟霍。 梳的紋絲不亂的頭發(fā)上杏头,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音沸呐,去河邊找鬼醇王。 笑死,一個胖子當(dāng)著我的面吹牛崭添,可吹牛的內(nèi)容都是我干的寓娩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼呼渣,長吁一口氣:“原來是場噩夢啊……” “哼棘伴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屁置,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焊夸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓝角,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阱穗,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡饭冬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揪阶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌抠。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遣钳,靈堂內(nèi)的尸體忽然破棺而出扰魂,到底是詐尸還是另有隱情,我是刑警寧澤蕴茴,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布劝评,位于F島的核電站,受9級特大地震影響倦淀,放射性物質(zhì)發(fā)生泄漏蒋畜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一撞叽、第九天 我趴在偏房一處隱蔽的房頂上張望姻成。 院中可真熱鬧,春花似錦愿棋、人聲如沸科展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽才睹。三九已至,卻和暖如春甘邀,著一層夾襖步出監(jiān)牢的瞬間琅攘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工松邪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坞琴,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓逗抑,卻偏偏與公主長得像剧辐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邮府,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359