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

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

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问题的更多相关文章

  1. swift开发之--Protocol(协议)

    使用object-c语言的同学们肯定对协议都不陌生,但在swift中苹果将protocol这种语法发扬的更加深入和彻底. Swift中的protocol不仅能定义方法还能定义属性,配合extensio ...

  2. swift学习笔记之-协议

    //协议(Protocols) import UIKit /*协议(Protocols) 1.协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法.属性,以及其他需要的东西 2.类.结构体或枚 ...

  3. Swift中文教程(七)--协议,扩展和泛型

    Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(stru ...

  4. 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...

  5. Swift 学习笔记(面向协议编程)

    在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ...

  6. Swift—类的继承-备

    Swift中的继承只能发生在类上,不能发生在枚举和结构体上.一个类可以继承另一个类的方法.属性.下标等特征,当一个类继承其他类时,继承类叫子类,被继承类叫父类(或超类).子类继承父类后,可以重写父类的 ...

  7. 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

    一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMP ...

  8. Object-C非正式协议与正式协议的区别

    Object-C非正式协议与正式协议的区别 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是 ...

  9. Objective-C非正式协议与正式协议

    这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...

随机推荐

  1. ORA-00600: internal error code, arguments: [2662], [0], [1106971], [0], [1107731], [12583040]

    今天是2014-06-06,在进行数据库恢复的时候出现了一个久违的ora-600 [2662]错误.特整理例如以下: 问题描写叙述: system及数据文件误删,採用恢复数据文件的方式将数据库恢复到開 ...

  2. objective-c中#import和@class的差别

    在Objective-C中,能够使用#import和@class来引用别的类型, 可是你知道两者有什么差别吗? @class叫做forward-class,  你常常会在头文件的定义中看到通过@cla ...

  3. ArrayList概述

    一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...

  4. Hibernate的基本开发流程

    一.Hibernate开发的基本流程 二.Hibernate开发的环境搭建 1.引入Hibernate核心包以及Hibernate依赖包即可.可以在Hibernate目录下的\lib\required ...

  5. 九度OJ 1088:剩下的树 (线段树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5791 解决:2649 题目描述: 有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点 ...

  6. jQuery param()作用与使用方法

    $.param()方法是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化. $.param(obj) 返回 :string: 说明:将jquery对象按照name ...

  7. Python升级已经安装的第三方库

    Python升级已经安装的第三方库 主要两步操作,查看需要升级库,升级库.如下: pip list # 列出安装的库 pip list --outdated # 列出有更新的库 pip install ...

  8. Oracle 数据库基础 出现invalid username/password; logon denied错误解决方案

    出现invalid username/password; logon denied错误解决方案 [win7或win8中 cmd要以管理员身份运行] 1.Dos下输入命令:sqlplus sys/安装时 ...

  9. 使用eclipse的SVN连接码云

    码云配置: 码云的项目上,启用SVN访问 eclipse的配置,不配置这个会报错

  10. hadoop 添加,删除节点

    http://www.cnblogs.com/tommyli/p/3418273.html