属性要求
协议
能够要求其遵循者
必须含有一些特定名称和类型的实例属性(instance property)
或类属性 (type property)
,也能够要求属性具有(设置权限)settable
和(访问权限)gettable
,但它不要求属性
是存储型属性(stored property)
还是计算型属性(calculate property)
。
如果协议要求属性具有设置权限和访问权限,那常量存储型属性或者只读计算型属性都无法满足此要求。如果协议只要求属性具有访问权限,那任何类型的属性都可以满足此要求,无论这些属性是否具有设置权限。
通常前置var
关键字将属性声明为变量。在属性声明后写上{ get set }
表示属性为可读写的。{ get }
用来表示属性为可读的。即使你为可读的属性实现了setter
方法,它也不会出错。
protocol SomeProtocol {
var musBeSettable : Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
用类来实现协议时,使用class
关键字来表示该属性为类成员;用结构体或枚举实现协议时,则使用static
关键字来表示:
protocol AnotherProtocol {
class var someTypeProperty: Int { get set }
}
protocol FullyNamed {
var fullName: String { get }
}
FullyNamed
协议含有fullName
属性。因此其遵循者
必须含有一个名为fullName
,类型为String
的可读属性。
struct Person: FullyNamed{
var fullName: String
}
let john = Person(fullName: "John Appleseed")
//john.fullName 为 "John Appleseed"
Person
结构体含有一个名为fullName
的存储型属性
,完整的遵循
了协议。(若协议未被完整遵循,编译时则会报错)。
如下所示,Startship
类遵循
了FullyNamed
协议:
class Starship: FullyNamed {
var prefix: String?
var name: String
init(name: String, prefix: String? = nil ) {
self.anme = name
self.prefix = prefix
}
var fullName: String {
return (prefix ? prefix ! + " " : " ") + name
}
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName == "USS Enterprise"
Starship
类将fullName
实现为可读的计算型属性
。它的每一个实例都有一个名为name
的必备属性和一个名为prefix
的可选属性。 当prefix
存在时,将prefix
插入到name
之前来为Starship
构建fullName
。
易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
- Java技术群: 227270512 (人数:2000,免费:否)
- Go开发者群(新): 851549018 (人数:1000,免费)
- PHP开发者群: 460153241 (人数:2000,免费)
- MySQL/SQL群: 418407075 (人数:2000,免费:否)
- 大数据开发群: 655154550 (人数:2000,免费:否)
- Python技术群: 287904175 (人数:2000,免费:否)
- 人工智能深度学习: 456236082 (人数:2000,免费:否)
- 测试工程师群: 415553199 (人数:2000,免费:否)
- 前端开发者群: 410430016 (人数:2000,免费:否)
- C/C++技术群(新): 629264796 (人数:2000,免费)
- Node.js技术群(新): 621549808 (人数:2000,免费)
- PostgreSQL数据库群: 539504187 (人数:1000,免费)
- Linux运维技术群: 479429477 (人数:2000,免费:否)
- Oracle数据库: 175248146 (人数:2000,免费:否)
- C#/ASP.Net开发者: 579821706 (人数:2000,免费)
- 数据分析师群: 397883996 (人数:2000,免费:否)