欢乐捕鱼之海底极乐

蘇飛論壇

 找回密碼
 馬上注冊

QQ登錄

只需一步,快速開始

掃一掃,訪問微社區

分布式系統框架(V2.0) 輕松承載百億數據,千萬流量!討論專區 - 源碼下載 - 官方教程

HttpHelper萬能框架(V2.3-含.netcore) HttpHelper官方出品,無敵框架討論區 - 源碼下載 - 在線測試和代碼生成

HttpHelper爬蟲類(V2.0) 最牛的爬蟲類,沒有爬不到只有想不到 源碼 - 代碼生成器 - 討論區 - 教程- 例子

查看: 837|回復: 2
打印 上一主題 下一主題

[Swift] 【Swift基礎教程】協議之屬性要求

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2019-2-1 16:32:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


   導讀

【Swift基礎教程】目錄   http://www.gtcwi.tw/thread-24641-1-1.html



屬性要求


協議可以要求遵循協議的類型提供特定名稱和類型的實例屬性或類型屬性。協議不指定屬性是存儲型屬性還是計算型屬性,它只指定屬性的名稱和類型。此外,協議還指定屬性是可讀的還是可讀可寫的。

如果協議要求屬性是可讀可寫的,那么該屬性不能是常量屬性或只讀的計算型屬性。如果協議只要求屬性是可讀的,那么該屬性不僅可以是可讀的,如果代碼需要的話,還可以是可寫的。

協議總是用 var 關鍵字來聲明變量屬性,在類型聲明后加上 { set get } 來表示屬性是可讀可寫的,可讀屬性則用 { get } 來表示:

protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}
在協議中定義類型屬性時,總是使用 static 關鍵字作為前綴。當類類型遵循協議時,除了 static 關鍵字,還可以使用 class 關鍵字來聲明類型屬性:

protocol AnotherProtocol {
    static var someTypeProperty: Int { get set }
}

如下所示,這是一個只含有一個實例屬性要求的協議:

protocol FullyNamed {
    var fullName: String { get }
}

FullyNamed 協議除了要求遵循協議的類型提供 fullName 屬性外,并沒有其他特別的要求。這個協議表示,任何遵循 FullyNamed 的類型,都必須有一個可讀的 String 類型的實例屬性 fullName。

下面是一個遵循 FullyNamed 協議的簡單結構體:

struct Person: FullyNamed {
    var fullName: String
}
let john = Person(fullName: "John Appleseed")
// john.fullName 為 "John Appleseed"

這個例子中定義了一個叫做 Person 的結構體,用來表示一個具有名字的人。從第一行代碼可以看出,它遵循了  FullyNamed 協議。

Person 結構體的每一個實例都有一個 String 類型的存儲型屬性 fullName。這正好滿足了 FullyNamed 協議的要求,也就意味著 Person 結構體正確地符合了協議。(如果協議要求未被完全滿足,在編譯時會報錯。)

下面是一個更為復雜的類,它適配并遵循了 FullyNamed 協議:

class Starship: FullyNamed {
    var prefix: String?
    var name: String
    init(name: String, prefix: String? = nil) {
        self.name = name
        self.prefix = prefix
    }
    var fullName: String {
        return (prefix != nil ? prefix! + " " : "") + name
    }
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName 是 "USS Enterprise"

Starship 類把 fullName 屬性實現為只讀的計算型屬性。每一個 Starship 類的實例都有一個名為 name 的非可選屬性和一個名為 prefix 的可選屬性。 當 prefix 存在時,計算型屬性 fullName 會將 prefix 插入到  name 之前,從而為星際飛船構建一個全名。

沙發
發表于 2019-2-1 17:35:10 | 只看該作者
板凳
發表于 2019-2-11 16:17:02 | 只看該作者
您需要登錄后才可以回帖 登錄 | 馬上注冊

本版積分規則

QQ|手機版|小黑屋|手機版|聯系我們|關于我們|廣告合作|蘇飛論壇 ( 豫ICP備17001017號-1)

GMT+8, 2019-12-8 10:59

© 2017-2018

快速回復 返回頂部 返回列表
欢乐捕鱼之海底极乐 澳洲幸运5合法吗 下载全民小视频怎样赚钱 福彩黑龙江p62开奖号 竞彩足球任选9场奖金 时时彩计划 北京时时彩赛车记录 天天彩票群 刺激战场开发商怎么赚钱 河北20选5计算 江西多乐彩开奖公告