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