Swift - 如何在函数中实现协议方法

时间:2017-12-26 02:02:45

标签: swift

在android中,可以在函数调用期间实现接口方法。例如,接口和函数的声明:

int result = scanf( “%d”, &number );
if ( result == 1 )
{
  // user entered one or more decimal digits for number
}
else if ( result == 0 )
{
  // user entered something that isn’t a decimal digit
}
else // result == EOF
{
  // EOF or error detected on input
}

函数调用:

//interface
interface exampleCallback {
    void success(String response);
    void error(String error);
}

//function
void exampleFunction(exampleCallback cb) {
    //do something
}

也就是说,可以为exampleFunction的每个函数调用定制成功/错误方法。 但是,经过一些谷歌搜索后,我只能找到在类或结构声明中实现协议方法的示例代码,其中的方法无法再自定义。我知道我可以将转义闭包作为函数参数来实现目标,即为每个函数调用自定义回调函数。但只是想知道我是否可以使用协议来做类似的事情......

2 个答案:

答案 0 :(得分:2)

您可以使用关联值创建枚举:

add_action( 'woocommerce_before_single_product_summary', 'woocommerce_before_single_product_summary_button', 5);

function woocommerce_before_single_product_summary_button() {
     echo ' <button class="backbutton" type="button" onclick="history.back();"> Back </button> ';
}

在方法的完成处理程序中使用枚举大小写来传递自定义字符串:

enum Result {
    case success(String)
    case error(CustomError)
}
enum CustomError: Error {
    case expired(String)
}

调用方法时,您可以切换枚举并在那里执行自定义实现,并使用回调中返回的关联值:

func exampleFunction(completion: @escaping (Result) -> ()) {
    if condition {
        completion(.success("Success String"))
    } else {
        completion(.error(.expired("Error String"))) 
    }
}

Playground Sample

答案 1 :(得分:0)

Java中的匿名类实际上只是一个&#34;解决方法&#34;由于没有作为&#34;一等公民的职能&#34;。

在swift中,函数是一等公民,因此您实际上并不需要传递实现单个方法的匿名类。您只需传递该方法(有点类似于Java 8&#39; lambdas)。

这在Java中:

interface ActionListener {
    void actionPerformed();
}

可以用Swift中的闭包类型表示:

() -> Void

而不是这样做:

someMethod(new ActionListener() {
    public void actionPerformed() { ... }
});

你在Swift中这样做:

someMethod { ... }

如果您的Java界面有多种方法可以实现,那该怎么办?

在这种情况下,您不能使用一个闭包代表它们。你需要

  • 使用多种方法创建协议,并在结构或类中实现它。你在UIKit中看到了很多这种模式。视图和视图控制器通常具有XXXDelegate
  • 传递一个关闭元组