博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift协议中类继承协议的mutating问题
阅读量:5138 次
发布时间:2019-06-13

本文共 1482 字,大约阅读时间需要 4 分钟。

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

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

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

你可能感兴趣的文章
ASP.NET MVC 拓展ViewResult实现word文档下载
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
Linux上架设boost的安装及配置过程
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
【模板】最小生成树
查看>>
网络编程
查看>>
java面试题
查看>>
pair的例子
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
Oracle中包的创建
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>