Swift协议中类继承协议的mutating问题

之前实际开发的时候遇到的一个小问题,网上也没有找到相关说明。本来当时弄明白了想着记下来的,但是比较忙就耽搁了,趁今天休息记录一下。

首先,我们看一下下面这个两数之和的协议

protocol Test: CustomStringConvertible {

    var num1: Int { get set }

    var num2: Int { get set }

    func getSum() -> Int

    func sum() //num1 变为num1+num2

}

 

extension Test {//文字输出num1

     var description: String {

        return "\(num1)"

    }

}

 

extension Test {

    func getSum() -> Int {

        return num1 + num2

    }

    mutating func sum() { //改变自身的变量,要加mutating

        num1 += num2

    }

 

}

 

playground没有报错,说明这个协议没问题。但是我们来试一下让class继承这个看似没有问题的协议

class TestClass: Test {

    var num1: Int

    var num2: Int

    init() {

        num1 = 0; num2 = 0

    }

    convenience init(_ num1: Int, _ num2: Int) {

        self.init()

        self.num1 = num1; self.num2 = num2

    }

 

}

结果编译器报错,Type 'TestClass' does not conform to protocol 'Test'

到底哪里出问题了?仔细一想,对于类而言mutating是不需要的,这是枚举型和结构体里改变自身变量的方法才需要前置的关键词。

最后个人的解决方案就是声明这个协议只有类可以继承,这样就可以删掉mutating了

protocol Test: class, CustomStringConvertible {

    var num1: Int { get set }

    var num2: Int { get set }

    func getSum() -> Int

    func sum() //num1 变为num1+num2

}

 

extension Test {//文字输出num1

     var description: String {

        return "\(num1)"

    }

}

 

extension Test {

    func getSum() -> Int {

        return num1 + num2

    }

    func sum() { //改变自身的变量,要加mutating

        self.num1 += self.num2

    }

}

 

class TestClass: Test {

    var num1: Int

    var num2: Int

    init() {

        num1 = 0; num2 = 0

    }

    convenience init(_ num1: Int, _ num2: Int) {

        self.init()

        self.num1 = num1; self.num2 = num2

    }

 

}

 

然后测试一下

var test = TestClass(1, 2)

print(test)

test.sum()

 

print(test)

 

运行结果如下

1

 

3

 

转载于:https://www.cnblogs.com/lancgg/p/8282084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值