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

标签 java objective-c swift interface protocols

在 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/

相关文章:

java - 使数组/矩阵可供程序中的其他方法使用。

java - 自定义TextView使用wrap_content截断

Swift test --filter 在实际运行测试时似乎排除了所有内容

Swift 包管理器动态库

iOS延迟更改背景颜色(快速)

java - 指定 Java CLASSPATH 变量

java - 获取月份的第一个星期一和最后一个星期日,跨越月份边界

ios - 可以针对 iOS 5.1.1(原始 iPad)的最新版本的 Xcode

ios - 没有混合层的圆形 UIView(带 cornerRadius)

objective-c - 如何在不引用类的情况下在 Objective C 中调用 +class 方法?