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

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

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

最新文章

  1. Hibernate使用
  2. .NET 创建Windows服务,及服务的安装卸载
  3. Python基础学习笔记(七)常用元组内置函数
  4. 洛谷P2723 丑数 Humble Numbers
  5. git 删除远程主分支及其它操作
  6. office2010安装出错,windows installer服务不能更新一个或多个受保护的windows文件
  7. Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作
  8. linux重要目录说明
  9. 学习笔记——Java字符串操作常用方法
  10. 记一次尴尬的git reset丢失分支故障
  11. java代码实现ftp服务器的文件上传和下载
  12. 为什么ssh 执行完命令以后 挂了, hang , stop respond
  13. python grib气象数据可视化
  14. 面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)
  15. SQL Server连接错误1326
  16. PAT 乙级 1047 编程团体赛(20) C++版
  17. stylus-loader (copy)
  18. j.u.c系列(04)---之AQS:同步状态的获取与释放
  19. jQuery 检查某个元素在页面上是否存在实例代码
  20. google::proto::message.h

热门文章

  1. poj 3233 Matrix Power Series(矩阵二分,高速幂)
  2. android启动另一应用
  3. 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
  4. 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
  5. Flow 的工作方式 类型检查
  6. 对于js里的闭包的理解
  7. npm ERR! Unexpected end of JSON input while parsing near '...inimist":"^1.2.0"}
  8. 20170313 ABAP程序未激活状态下保存或激活进入debug
  9. iOS信号量
  10. UIView封装动画--iOS 利用系统提供方法来做弹性运动