首页 > 解决方案 > 协议数组元素是按值传递还是按引用传递?

问题描述

我知道在 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

标签: swiftoopswift-protocolsprotocol-oriented

解决方案


不管数组如何声明,类是通过引用传递的,结构是通过值传递的。这可以通过以下示例进行演示:

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

推荐阅读