Swift - 如何将结构体传递给方法?

3
以下代码出现编译错误,因为它认为传递给函数的数组不可变。我知道Array是一个结构体,因此按值而不是按引用传递,那么当您将结构体传递给方法并且希望能够修改它时,该怎么处理呢?在这种情况下不想使用扩展。
var array = ["1", "2", "3"]
array.removeLast()
removeOne(array)

func removeOne(array: Array<AnyObject>) {
   array.removeLast()
}
2个回答

4

迈克 S 上面的回答是正确的,但是如果你想将其用于任何类型,你需要一个通用函数:

func removeOne<T>(inout array: Array<T>) {
    array.removeLast()
}

var array = ["1", "2", "3"]
removeOne(&array)

1
你可以使用一个输入输出参数来实现这个目的:
func removeOne(inout array: Array<String>) {
    array.removeLast()
}

var array = ["1", "2", "3"]
array.removeLast()
removeOne(&array)

还请注意,我将Array<AnyObject>更改为Array<String>,因为编译器会将var array = ["1", "2", "3"]定义为Array<String>,并且无法将其强制转换为Array<AnyObject>


那并不完全准确——Array<String>可以强制转换为Array<AnyObject>,但由于你将其传递给一个inout函数,它必须将Array<AnyObject>强制转换回Array<AnyObject>,这是不会自动进行的。 (它可以使用as关键字进行转换,但在调用inout函数时不可能这样做。) - Nate Cook
@Zaph 在Swift中,String是一个struct,因此无法继承自AnyObject。不过,Any也可能适用。 - Mike S
@NateCook 我原以为String是一个struct类型,因此不能将其转换为AnyObject。这不正确吗? - Mike S
虽然这一切都是真实的,但 Swift 的这些实现细节不应该强加于用户。另外需要考虑的是,String 类型与 NSString 类型相互转换,后者是一个类和对象。 - zaph
1
@JohnWoods 从文档中可以看到:当你将一个变量作为inout参数传递并且希望在函数内修改它时,需要在变量名前直接加上&符号来表示。 - Mike S
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接