Swift UIKit中如何通过函数更新作为参数传入的元组
Swift元组元素更新问题解决
错误原因
- Swift函数的参数默认是不可变的let常量,你尝试修改的
targetMacro是函数参数,默认被let修饰,因此无法直接修改它的属性。 - 元组是值类型,即便参数是var,传入函数的也是原元组的拷贝,修改拷贝不会影响外部的
fatParams变量,达不到更新原变量的需求。
解决方法
方法1:使用inout参数直接修改外部变量
inout关键字可以让函数直接操作外部传入的变量,而非操作拷贝。调用时需要在变量前加&符号:
var fatParams = (units: "g", amount: "") func setUnits(tappedButton: UIButton, targetMacro: inout (units: String, amount: String)) { targetMacro.units = tappedButton.currentTitle! } // 调用示例 setUnits(tappedButton: yourButton, targetMacro: &fatParams)
方法2:返回更新后的新元组,外部变量接收结果
如果不想用inout,可以让函数生成并返回一个新的元组,外部变量通过赋值更新:
var fatParams = (units: "g", amount: "") func setUnits(tappedButton: UIButton, targetMacro: (units: String, amount: String)) -> (units: String, amount: String) { var updatedTuple = targetMacro updatedTuple.units = tappedButton.currentTitle! return updatedTuple } // 调用示例 fatParams = setUnits(tappedButton: yourButton, targetMacro: fatParams)
补充说明
如果后续需求扩展,比如需要更多属性、自定义方法或者属性观察器,结构体确实会比元组更合适。但如果只是简单的两个值存储,上述两种方法都能满足你用元组更新元素的需求。
内容的提问来源于stack exchange,提问作者Adn
相关产品推荐
相关产品推荐

