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非正式协议与正式协议
这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...
随机推荐
- shiro框架的使用
1.配置二级缓存 <ehcache updateCheck="false" name="shiroCache"> <defaultCache ...
- 【TensorFlow-windows】(零)TensorFlow的"安装"
Tensorflow的安装,具体操作就不演示了.具体操作请移步: http://blog.csdn.net/darlingwood2013/article/details/60322258#comme ...
- iOS_高效开发之道
iOS_高效开发之道 话不多说, 总结一下个人感觉有利于提高iOS开发效率的几个小技巧. 本文将从下面几方面介绍: Xcode经常使用快捷键 Xcode调试技巧 Objc经常使用代码片段 Xcode插 ...
- php 实现简单加入购物车
今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...
- NoSQL的四大类型
1 键值数据库 相关产品:Redis.Riak.SimpleDB.Chordless.Scalaris.Memcached 应用:内容缓存 优点:扩展性好.灵活性好.大量写操作时性能高 缺点:无法存储 ...
- maven的基本原理和使用
一.Maven中央存储库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如 ...
- bootstrap-table 行内编辑
1.文件引入 <link rel="stylesheet" href="bootstrap.css"> <link rel="sty ...
- svn下载
首先介绍的是SVN安装包的下载,分别包括服务器版和客户端版 下载地址:http://subversion.apache.org/packages.html 打开后,点击Windows 分别下载客户端( ...
- 大数据之环境准备系列 ——第二篇 新装VMware 虚拟机 网络配置(NAT模式)
新安装虚拟机,需要配置网络环境,才可以使用ssh客户端(如xshell)远程登录 和 虚拟机访问Internet. 一. WMware 软件配置 WMware版本号:11.0.0 build-2305 ...
- appium(5)-Appium capabilities
Appium Capabilities Appium server capabilities Capability Description Values automationName Which au ...