gpt4 book ai didi

Swift 隐式传递 self 作为引用类型的 inout 参数

转载 作者:行者123 更新时间:2023-11-28 10:50:49 26 4
gpt4 key购买 nike

是否可以隐式传递 self 作为 inout 参数来修改引用变量?

这是一种可以将抽象基类转换为其具体子类之一的方法。我的问题是,我是否必须始终拥有第一个参数 obj: inout AbstractBaseClass,或者我是否可以隐式传递 self.我意识到这也可以表示为静态方法。

    func convertTo(_ obj: inout AbstractBaseClass, _ type: ConcreteClassTypes) {
switch type {
case .concreteClass1: obj = ConreteClass1()
case .concreteClass2: obj = ConcreteClass2()
}
}

完整代码如下:

class AbstractClass {

enum ConcreteType {
case concreteClass1
case concreteClass2
}

var id: Int = 0

fileprivate init() { }

func convert(_ obj: inout AbstractClass, to type: ConcreteType) {

let oldId = obj.id

switch type {
case .concreteClass1: obj = ConcreteClass1()
case .concreteClass2: obj = ConcreteClass2()
}

obj.id = oldId
}

class ConcreteClass1: AbstractClass {

override init() { super.init() }
}

class ConcreteClass2: AbstractClass {

override init() { super.init() }

}

}

var obj: AbstractClass = AbstractClass.ConcreteClass1()
obj.convert(&obj, to: .concreteClass2) //is there any way to eliminate this first argument?

最佳答案

和 matt 一样,我不相信 inout 是适合这种情况的工作工具。

尽管如此,如果您坚持这样做,实现您想要的目标的一种方法是(滥用)使用协议(protocol)扩展。它们允许定义 mutating 方法,这些方法将隐式 self 参数作为 inout 传递(以允许采用值类型的突变)。

所以你可以说:

protocol AbstractClassProtocol {}

class AbstractClass : AbstractClassProtocol {

enum ConcreteType {
case concreteClass1
case concreteClass2
}

fileprivate init() {}

class ConcreteClass1: AbstractClass {
override init() { super.init() }
}

class ConcreteClass2: AbstractClass {
override init() { super.init() }
}
}

extension AbstractClassProtocol where Self == AbstractClass {

mutating func convert(to type: AbstractClass.ConcreteType) {
switch type {
case .concreteClass1:
self = AbstractClass.ConcreteClass1()
case .concreteClass2:
self = AbstractClass.ConcreteClass2()
}
}
}

var obj: AbstractClass = AbstractClass.ConcreteClass1()
obj.convert(to: .concreteClass2)
print(obj) // AbstractClass.ConcreteClass2

但这有点像 hack,我会谨慎使用它。

关于Swift 隐式传递 self 作为引用类型的 inout 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46256552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com