如何在Swift中实现Objective-C而不定义新类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中实现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

如何在Java示例中的Swift代码中实现此协议?

答案

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中的块)并使用尾随闭包语法来实现它:

@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

以上是关于如何在Swift中实现Objective-C而不定义新类的主要内容,如果未能解决你的问题,请参考以下文章

如何在Swift中实现Objective-C而不定义新类

如何在swift中实现数组的深拷贝

如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?

在 Swift 中实现一个协议 [重复]

在 Swift 中实现 copy()

如何从同一个故事板访问 Objective-C 和 Swift 类?