将 PROTOCOL 的方法声明为 MUTATING

将 PROTOCOL 的方法声明为 MUTATING

由 王巍 (@ONEVCAT) 发布于 2014/08/17

Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的接口时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutating func myMethod()。Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,所以如果你没在接口方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个接口的话,就不能在方法里改变自己的变量了。比如下面的代码

protocol Vehicle
{
    var numberOfWheels: Int {get}
    var color: UIColor {get set}

    mutating func changeColor()
}

struct MyCar: Vehicle {
    let numberOfWheels = 4
    var color = UIColor.blueColor()!

    mutating func changeColor() {
        color = UIColor.redColor()
    }
}

如果把 protocol 定义中的 mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现接口;如果去掉 mutating 的话,会报错说不能改变结构体成员。这个接口的使用者的忧伤的眼神,相信你能想象得出。

另外,在使用 class 来实现带有 mutating 的方法的接口时,具体实现的前面是不需要加 mutating 修饰的,因为 class 可以随意更改自己的成员变量。所以说在接口里用 mutating 修饰方法,对于 class 的实现是完全透明,可以当作不存在的。

时间: 2024-11-07 23:46:29

将 PROTOCOL 的方法声明为 MUTATING的相关文章

1217.2——定义一个类+方法声明调用

新建一个类 new file  ->cocoa class  (父类NSObject) .h文件 用来定义属性和方法 .m文件 用来具体实现 方法声明: 1 #import <Foundation/Foundation.h> 2 @interface Person : NSObject{ 3 NSString *name; 4 int age; 5 NSString *address; 6 } 7 -(void)useTools; //无参无返回值的方法声明 8 -(void)setNa

&lt;02&gt;【掌握】01-类的声明和实现+【掌握】13-创建一个对象并访问成员变量+【掌握】14-无参方法声明实现及调用+【掌握】15-有参方法声明实现及调用+

[掌握]01-类的声明和实现 类: 一类事物共同特征和行为的抽象 大卡车 小轿车 挖掘机 车类: Car 共同的特征(属性): 颜色 速度 轮子 共同的行为: 跑 停止 对象: 类的具体的个体 东风21D(车类的对象) 解放大卡车(车类的对象) BYD (车的对象) 时风 (车的对象) 2.类的定义 结构体定义 struct Student{ }; ---->定义一个Student 结构体 类的定义分为两部分: 1)类的声明(规定当前类的:类名.属性.行为) @interface 类名:父类名

Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一下.依据javah自己主动生成的头文件.能够看出原生方法的声明和定义,比如: JNIEXPORT jstring JNICALL Java_com_shamoo_helljni_HelloJni_stringFromJNI(JNIEnv *, jobject); 虽然Java上的原生方法没有不论什么

方法声明与方法定义 什么时候程序可以运行 oc

如果调用一个对象没有声明的方法:编译可以通过:链接也可以通过:但是不能运行: 如果你声明了一个方法,没有实现,编译和链接都可以通过:但是不能运行: OC中调用方法的时候是在运行过程中才会检测对象有没有实现相应的方法: 如果你实现了一个方法,没有定义,编译和链接都可以通过,运行也可以成功: 在程序运行过程中出现问题就会出现闪退:

c# 第21节 方法声明和调用

本节内容: 1:为什么要有方法 2:方法的声明及使用 3:方法params 传入接收数组 4:值传递和引用传递 5:输出参数out 1:为什么要有方法 2:方法的声明及使用 声明实例: 3:方法params 传入接收数组 4:值传递和引用传递 实例操作:值传递和引用传递(必须先声明) 输出: 5:输出参数out 实例:判断一个数组的最大值,并返回一个最大值的数据,和最大值得索引 ‘ ’ 原文地址:https://www.cnblogs.com/hero799/p/8663179.html

iOS AppDelegate 头文件中默认的方法声明,中文翻译

如题: 1 #import "AppDelegate.h" 2 3 @interface AppDelegate () 4 5 @end 6 7 @implementation AppDelegate 8 9 10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 11 // 程序在启动之后,重写自定义设置的位置 1

OC 方法声明使用

Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; // 方法名是setAge: - (int)age; // 方法名是age // 方法名是setAge:andNo: // - (void)setAge:(int)newAge andNo:(int)no; @end Person.m #import "Person

Objective-c 类 方法声明 初始化及调用

// // Student.h // OOP // // Created by acgity on 16/5/16. // Copyright © 2016年 acgity. All rights reserved. // #import <Foundation/Foundation.h> typedef enum { male,female } SEX; @interface Student : NSObject { @public NSString *_name; int _age; SE

对mybastis 的理解2--BaseDao接口方法声明

package org.xnat.dao;  import java.util.List; import java.util.Map;  import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import org.xnat.dao.util.AutoMap; import org.xnat.dao.util.Page;   /**  * 不直接用此baseDao 外