在 Java 中,我们可以非常简单地声明一个接口(interface),然后创建一个符合该接口(interface)的新对象。
public interface Executer {
void execute();
}
Executer executer = new Executer() {
@Override
public void execute() {
System.out.println("we did it!");
}
}
现在我想做同样的事情,通过在 Objective-C 中定义一个协议(protocol)并在 Swift 中实现它。
@protocol Executer <NSObject>
- (void)execute;
@end
如何像在 Java 示例中那样在我的 Swift 代码中实现此协议(protocol)?
最佳答案
Swift 没有直接等效于 Java 的匿名类。
你没有说为什么你想这样做,例如这个结构是什么让你想要它而不是 Swift 提供的?鉴于我们只会展示两种选择,也许一种适合您。
Swift 支持嵌套类型,所以你可以在你的类中声明一个本地类型并实例化它。例如:
@objc public class Explore : NSObject
{
@objc private class notAnAnonButPrivateClass : NSObject, Executer
{
func execute() -> Void
{
print("we did it!")
}
}
var executer : Executer = notAnAnonButPrivateClass()
这声明了私有(private)类,然后实例变量初始化为它的一个实例。
如果您希望能够提供与声明内联的 execute()
的实现,那么您可以使用 Swift 闭包(相当于 在 Objective-C 中阻止)并使用尾随闭包语法来美化它:
@objc private class notAnAnonButPrivateClass : NSObject, Executer
{
let executeImpl : () -> Void
init(_ theImpl : @escaping () -> Void)
{
executeImpl = theImpl
}
func execute() -> Void
{
executeImpl()
}
}
var executer : Executer = notAnAnonButPrivateClass() {
print("we did it again!")
}
在这个版本中,私有(private)类的 init
采用一个闭包来用于 execute()
的主体,并且该闭包直接写入实例变量初始化中.
这个版本在语义上也不同于第一个版本,因为闭包可以从其封闭范围捕获值和变量。
所以总结一下:你没有匿名类,你必须给它们一个名字(但可以使用比 notAnAnonButPrivateClass
更明智的东西!)并且这个名字不会“泄漏”到其余部分您的代码(private
位);如果您(真的)希望在实例化时提供方法体,则可以。也许其中之一适合您。
HTH
关于java - 如何在不定义新类的情况下在 Swift 中实现 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917606/