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
Swift协议中类继承协议的mutating问题的更多相关文章
- swift开发之--Protocol(协议)
使用object-c语言的同学们肯定对协议都不陌生,但在swift中苹果将protocol这种语法发扬的更加深入和彻底. Swift中的protocol不仅能定义方法还能定义属性,配合extensio ...
- swift学习笔记之-协议
//协议(Protocols) import UIKit /*协议(Protocols) 1.协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法.属性,以及其他需要的东西 2.类.结构体或枚 ...
- Swift中文教程(七)--协议,扩展和泛型
Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(stru ...
- 【iOS】Swift扩展extension和协议protocol
加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...
- Swift 学习笔记(面向协议编程)
在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ...
- Swift—类的继承-备
Swift中的继承只能发生在类上,不能发生在枚举和结构体上.一个类可以继承另一个类的方法.属性.下标等特征,当一个类继承其他类时,继承类叫子类,被继承类叫父类(或超类).子类继承父类后,可以重写父类的 ...
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
一.先看下相关国外的专业数据对四大协议的比较: Protocol CoAP XMP ...
- Object-C非正式协议与正式协议的区别
Object-C非正式协议与正式协议的区别 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是 ...
- Objective-C非正式协议与正式协议
这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...
随机推荐
- oracle死锁的检测查询及处理
-- 死锁查询语句 SELECT bs.username "Blocking User", bs.username "DB User", ws.username ...
- JavaScript常用库
提供个学习几种库的url,记录下. 1.JavaScript简介 JavaScript是Netscape公司开发的一种脚本语言(scripting language).JavaScript的出现使得网 ...
- 【caffe-windows】 caffe-master 之 卷积核可视化(利用matlab)
此篇是利用matlab对caffemodel的卷积核进行可视化.只介绍了卷积核的可视化,不涉及特征图的可视化. 是参考此博客: http://blog.csdn.net/zb1165048017/ar ...
- iOS设备控制打印机输出文本
本文转载至 http://tec.5lulu.com/detail/108krn1e6e66m8sbd.html 让我们来看看是如何实现的吧,首先要知道打印机的ip地址,然后用socket通过打印机的 ...
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
本文转自Holo的博客:http://blog.csdn.net/u013758734/article/details/50834770 最近在研究EasyDarwin的Push库EasyPusher ...
- 云计算系列——HIVE1.2.1 环境搭建
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...
- git推送已有项目到gitee
有时候会接收一个项目,这个项目已有git版本控制,但git 远端服务器地址已失效(员工离职,原先是推送到他个人gitee上的). 要按照如下步骤,将该项目推送到gitee. 1.先去gitee上新建一 ...
- HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2264 思路 从终点往起点走 然后每次更新状态 因为要满足 最短路线 所以其实 只能是 往左走,往下走 或 ...
- Relocation POJ-2923
题目链接 题目意思: 有 n 个货物,并且知道了每个货物的重量,每次用载重量分别为c1,c2的火车装载,问最少需要运送多少次可以将货物运完. 分析:本题可以用二进制枚举所有不冲突的方案,再来dp 一下 ...
- 51Nod - 1304 :字符串的相似度 (裸的扩展KMP)
我们定义2个字符串的相似度等于两个串的相同前缀的长度.例如 "abc" 同 "abd" 的相似度为2,"aaa" 同 "aaab& ...