swift - 协议数组元素是按值传递还是按引用传递?
问题描述
我知道在 Swift 中结构是按值传递的,类是按引用传递的。
我想知道我是否创建了一个提供协议的数组存储元素。这些元素是通过值还是引用传递?
它是基于模型一个类或结构的定义吗?
class ClassA: ProtocolA {
// something
}
struct StructA: ProtocolA {
// something
}
var arr: [ProtocolA] = [ClassA(), StructA()]
exampleFunction(arr[0]) // is it passed by reference
exampleFunction(arr[1]) // is it passed by value
解决方案
不管数组如何声明,类是通过引用传递的,结构是通过值传递的。这可以通过以下示例进行演示:
protocol ProtocolA {
var title: String { get set}
}
class ClassA: ProtocolA {
var title = "ClassA"
}
struct StructA: ProtocolA {
var title = "StructA"
}
var arr: [ProtocolA] = [ClassA(), StructA()]
print(arr[0].title) // ClassA
print(arr[1].title) // StructA
func exampleFunction(_ obj: ProtocolA) {
var obj = obj // Create local mutable variable
obj.title = obj.title + "!!!"
}
exampleFunction(arr[0])
exampleFunction(arr[1])
print(arr[0].title) // ClassA!!!
print(arr[1].title) // StructA
推荐阅读
- twitter-bootstrap - Bootstrap 4.3:超过 1200 (xl) 屏幕宽度的列扩展
- r - r 将 httr GET 响应解析为单个数据帧
- sql-like - SQL LIKE 运算符未显示任何结果
- react-native - 本地计划通知反应原生
- spring-boot - MeterRegistry 计数器不增加
- c++ - 在 Windows 10 上使用 C++ 中的线程出现问题(使用 g++ 作为编译器)
- python - python ast SyntaxError:未知原因的无效语法
- email - Amazon LEX 本机电子邮件槽类型无法识别以 4 位数字结尾的电子邮件
- node.js - 将 NodeJS 缓冲区转换为整数
- core - 配置文件错误启动 Nagios 服务