美文网首页
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