美文网首页
Swift:协议作为类型使用的一个好处

Swift:协议作为类型使用的一个好处

作者: 桃花流水鳜鱼肥 | 来源:发表于2017-03-29 10:56 被阅读209次

在Swift里,协议可以像intString一样,作为变量的类型来使用。如:

protocol CompanyRules {
    func responsibility() -> String
}

class LiLei: CompanyRules {
    func responsibility() -> String {
        return "lilei负责重活"
    }
}

var myInstance: CompanyRules?
myInstance = LiLei()

myInstance的类型是CompanyRules,那么任何服从CompanyRules协议的实例都可以赋值给myInstance,这就是协议作为变量类型的好处。

然而我发现这里使用 Any类型也能达到要求,那么使用AnyCompanyRules作为变量的类型的区别是什么?

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表示公司规则,员工LiLeiMeiMei都服从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则需要先判断它的类型,然后转化为对应的类型才能使用

相关文章

网友评论

      本文标题:Swift:协议作为类型使用的一个好处

      本文链接:https://www.haomeiwen.com/subject/tbilnttx.html