Java 如何在不定义新类的情况下在Swift中实现Objective-C

Java 如何在不定义新类的情况下在Swift中实现Objective-C,java,objective-c,swift,interface,protocols,Java,Objective C,Swift,Interface,Protocols,在Java中,我们可以声明一个接口,然后创建一个符合该接口的新对象,非常简单 public interface Executer { void execute(); } Executer executer = new Executer() { @Override public void execute() { System.out.println("we did it!"); } } 现在我想做同样的事情,在Objective-C中定义一

在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
@协议执行器
-(无效)执行;
@结束

如何在我的Swift代码中实现该协议,如Java示例中所示?

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闭包(相当于Objective-C中的block)并使用尾部闭包语法对其进行修饰:

@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()
的主体,该闭包直接写入实例变量初始化中的行中

这个版本在语义上也不同于第一个版本,因为闭包可能从其封闭范围捕获值和变量

因此,总结一下:你没有得到一个非类,你必须给它们一个名称(但可以使用比
notAnAnonButPrivateClass
!)更合理的名称),并且这个名称不会“泄漏”到你的代码的其余部分(
private
位);如果您(真的)希望在实例化时提供方法体,您可以这样做。也许其中一个适合你


HTH

您能详细说明您的要求吗??如果您想在Swift中使用ObjC协议,那么首先需要添加一个桥头类,以便可以在Swift中访问ObjC代码。协议的目的在两种语言中是相同的。如果您想将其定义为与您编写的Java代码类似的代码,那么我建议您使用Swift编写协议,因为它们在Swift中比在ObjC中更强大。然后使用协议扩展功能扩展它们。@Deepak我想通过重写/实现execute方法在Swift中实例化Executor类。我知道桥接头,这很好。您不能像Swift协议扩展功能那样扩展ObjC协议。但是您可以像这样使用ObjC协议:-类Test:NSObject,Executer{func execute(){print(“tested”)}}@Deepak谢谢。不过,我不想像在Java中那样显式定义一个新类。有什么方法可以做到这一点吗?如果你的协议是swift协议,那么协议扩展就是你的答案,但是你无法用ObjC协议做到这一点。谢谢!这就是我需要的。我在Java中使用这种结构,在类
A
中有一个内部
Executor
变量,我希望能够在实例化后设置该变量。它由类
B
的实例设置,类
B
创建的
执行器必须有其
execute
方法引用
B
实例的内部范围。这是一种从外部上下文动态设置方法的方法。现在我正在修改用Objective-C编写的CocoaPod,我需要能够从我的应用程序主体(用Swift编写)中动态设置对象的方法。