gpt4 book ai didi

Swift:覆盖对象方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:11 25 4
gpt4 key购买 nike

我正在定义一个类:

class Person {
func speak(phrase: String) {
NSLog("\(phrase)")
}
}

假设我想改变speak 方法的行为。在 Java 中我会覆盖这个方法:

Person p = new Person() {
@Override
public void speak(String phrase) {
// Do something different
}
};

我如何重写 Swift 中的方法?我尝试了以下无济于事:

let person = Person()
person.speak = { (String) -> () in
// Do something different
}

错误:无法分配给“person”中的“speak”

我知道我可以设置一个变量来改变行为或子类 Person,但我正在考虑一个不同的用例,其中需要这样的东西。使用这个例子更容易解释。

最佳答案

您不能在 Swift 中以这种方式创建匿名类,相反您必须派生一个新类:

class AnotherPerson: Person {
override func speak(phrase: String) {
NSLog("\(phrase) overidden!")
}
}

最接近覆盖特定方法的匿名实例化是使 speak 成为函数属性:

class Person {
var speak: (String)->() = { (phrase: String) in
println(phrase)
}
}

let person = Person()
person.speak("Frank") // => Frank
person.speak = { (phrase: String) in println("Hi, \(phrase)") }
person.speak("Frank") // => Hi, Frank

如果您不希望随机消费者能够修改speak,您可以通过初始化程序将其设置为let属性:

class Person {
let speak: (String)->()

init(speaker: (String)->() = println) {
speak = speaker
}
}

Person().speak("Frank") // => Frank
Person({ println("Hi, \($0)") }).speak("Frank") // => Hi, Frank

let person = Person()
person.speak = { println($0) } // error: cannot assign to speak

这里我们将默认设置为 println,从而保留了原始的默认行为。

关于Swift:覆盖对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28679107/

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