结构体的变异方法

本文介绍了Swift编程语言中如何使用变异方法来修改结构体或枚举类型的值。通过实例展示了如何定义并应用mutating关键字来改变值类型的属性,并且演示了在枚举中通过变异方法实现状态转换。

在Swift中,结构体类型或枚举类型等值类型有时需要通过实例方法来修改属性的值,但默认情况下是不能通过实例化对象通过该方法修改属性的值,这时只需要在该方法前加上mutating关键字即可,这种方法就成为变异方法。

struct MyPoint {
    var x: Int = 0
    var y: Int = 0
    
    mutating func setPoint(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
    func show() {
        print("x:\(x), y:\(y)")
    }
}

var p = MyPoint()
p.setPoint(x: 1, y: 2)
p.show() //打印 x:1, y:2

甚至可以通过mutating修改self的值:

enum LightSwitch {
    case OFF,LOW,HIGH
    mutating func next() {
        switch self {
        case .OFF:
            self = .LOW
        case .LOW:
            self = .HIGH
        case .HIGH:
            self = .OFF
        }
    }
}
//调用
var light = LightSwitch.OFF
print(light) //打印OFF
light.next()
print(light) //打印LOW



### Vue2 中重写数组变异方法以触发视图更新 在 Vue2 的响应式系统中,为了确保当数组发生变更时能够自动触发视图更新,Vue 对一些常见的 JavaScript 数组方法进行了拦截和重写。这些被称为 **变异方法** 的函数包括 `push`、`pop`、`shift`、`unshift`、`splice`、`sort` 和 `reverse`[^1]。 #### 响应式机制原理 Vue 使用对象的属性劫持技术来实现数据的双向绑定。对于数组来说,Vue 通过重写上述提到的变异方法,在每次调用这些方法时都会通知观察者 (Observer),从而触发依赖收集器 (Dep) 来更新视图[^3]。 如果开发者需要手动定义自定义逻辑或者扩展默认行为,则可以通过以下方式重新封装这些方法: --- #### 自定义重写的示例代码 以下是基于 Vue2 实现的一个简单例子,展示如何覆盖原生数组方法并保持其响应性: ```javascript let vm = new Vue({ el: '#app', data: { myArray: [1, 2, 3], }, }); // 手动重写 push 方法 Object.defineProperty(Array.prototype, 'myPush', { value(...items) { const result = this.push(...items); // 调用 Vue 的 $set 或 set 方法显式设置新项为响应式 items.forEach((item, index) => { Vue.set(this, this.length - items.length + index, item); }); return result; } }); // 测试新增功能 vm.myArray.myPush('newItem'); console.log(vm.myArray); // 输出:[1, 2, 3, "newItem"] ``` 此代码片段展示了如何创建一个新的原型链上的方法 (`myPush`) 并利用 Vue 提供的工具函数 `Vue.set()` 将每一项都标记成响应式的状态[^4]。 同样地,其他几种常见操作也可以按照类似的模式去改写: - **Pop**: 删除最后一位元素; - **Shift**: 移除首位成员; - **Unshift**: 添加到最前面位置; - **Splice**, **Sort**, 及 **Reverse** 则涉及更复杂的内部结构调整过程。 每种情况都需要特别注意维护好索引关系以及可能影响性能的因素。 --- #### 替代方案——使用 `$set/$delete` 除了直接修改 Array 类型的行为之外,还可以借助框架内置 API 完成特定场景下的需求调整。比如针对某些无法正常监听变化的情况(如直接赋值给某个下标的数值),推荐采用如下形式处理: ```javascript this.$set(arrayInstance, indexOfElementToChange, newValue); // 或者全局静态版本 Vue.set(targetArray, keyOrIndexPosition, updatedValue); ``` 这种方法不仅适用于普通的键值对结构体,也兼容多维嵌套情形下的深层路径访问控制问题解决策略[^2]。 --- ### 总结 综上所述,在实际开发过程中遇到复杂业务逻辑要求我们灵活运用各种技巧手段达成目标效果的同时也要兼顾效率考量;而理解清楚底层运作机理有助于做出更加合理的设计决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值