在Java中,我们可以声明一个接口,然后创建一个非常简单地符合该接口的新对象。
public interface Executer {
void execute();
}
Executer executer = new Executer() {
@Override
public void execute() {
System.out.println("we did it!");
}
}
现在我想通过在Objective-C中定义协议并在Swift中实现它来做同样的事情。
@protocol Executer <NSObject>
- (void)execute;
@end
如何在Java示例中的Swift代码中实现此协议?
答案 0 :(得分:1)
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()
这声明私有类,然后初始化为实例化的实例变量。
如果您希望能够提供execute()
内联声明的实现,那么您可以使用Swift 闭包(相当于 block )来实现在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!")
}
在这个版本中,私有类'init
接受一个闭包用于execute()
的主体,并且该闭包在实例变量初始化中直接写入。
这个版本在语义上也与第一个版本不同,因为闭包可以从其封闭范围中捕获值和变量。
总结一下:你没有获得anon类,你必须给它们一个名字(但可以使用比notAnAnonButPrivateClass
更合理的东西!)并且该名称不会“泄漏”到你的其余代码中(private
位);如果你(真的)希望在实例化时提供方法体,你就可以。也许其中一个适合你。
HTH