在Swift里,协议可以像int
、String
一样,作为变量的类型来使用。如:
protocol CompanyRules {
func responsibility() -> String
}
class LiLei: CompanyRules {
func responsibility() -> String {
return "lilei负责重活"
}
}
var myInstance: CompanyRules?
myInstance = LiLei()
myInstance
的类型是CompanyRules
,那么任何服从CompanyRules
协议的实例都可以赋值给myInstance
,这就是协议作为变量类型的好处。
然而我发现这里使用 Any
类型也能达到要求,那么使用Any
和CompanyRules
作为变量的类型的区别是什么?
protocol CompanyRules {
func responsibility() -> String
}
class LiLei: CompanyRules {
func responsibility() -> String {
return "lilei负责重活"
}
}
class MeiMei: CompanyRules {
func responsibility() -> String {
return "meimei负责轻活"
}
}
class Employee: NSObject {
var sexy: String?
var _person: CompanyRules?
var person: CompanyRules {
get {
if sexy == "男" {
return LiLei()
}
else{
return MeiMei()
}
}
}
var _person1: Any?
var person1: Any {
get {
if sexy == "男" {
return LiLei()
}
else{
return MeiMei()
}
}
}
override init() {
super.init()
self.sexy = "男"
}
}
说明:协议CompanyRules
表示公司规则,员工LiLei
和MeiMei
都服从CompanyRules
。现在有雇员类Employee
里有一个变量person
,根据性别返回不同的实例。因为person
的类型是CompanyRules
,因此任何采取了CompanyRules
的实例都可以赋值给person
。
同样,有一个变量person1
,作用和person
类似,但是它的类型是Any
,那么任何类型都可以赋值给person1
。
现在我们根据不同性别来获取员工的职责:
func doSomething(item: UIBarButtonItem) {
//获取person的职责
let employee = Employee()
print(employee.person.responsibility())
//获取person1的职责
if employee.person1 is LiLei {
let instance = employee.person1 as! LiLei
print(instance.responsibility())
}
else{
let instance = employee.person1 as! MeiMei
print(instance.responsibility())
}
}
说明:可以看到,类型为协议的person
可以直接输出员工的职责,但是Any
类型的person1
则需要先判断它的类型,然后转化为对应的类型才能使用
网友评论