【发布时间】:2016-11-08 02:44:01
【问题描述】:
我在swift(称为MyFramework)中创建了Cocoa Touch Framework。在 MyFramework 我有需要函数作为参数的方法。简而言之,MyFramework 包含以下代码:
public class MyFramework : NSObject {
public func MyMethod(successCallback : (String) -> Void, errorCallback : (String, String) -> Void) -> Void {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// successCallback("some value");
// errorCallback("error reason", "error message");
});
}
}
我可以将MyFramework 包含在Single View Application 中,称为MyAppSwift(在swift 中),并通过此代码成功调用ViewController.swift 中的MyFramework 的MyMethod:
class ViewController: UIViewController {
let myframework : MyFramework = MyFramework();
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
myframework.MyMethod(self.onSuccess, errorCallback : self.onError);
}
private func onSuccess(value : String) {
// ...
}
private func onError(reason : String, error : String) {
// ...
}
}
我可以在Single View Application 中包含MyFramework,称为MyAppObjectiveC(在objective-c 中),但我不知道如何在ViewController.m 中调用MyFramework 的MyMethod ...
// In ViewController.h
#import <UIKit/UIKit.h>
#import <MyFramework/MyFramework.h>
@interface ViewController : UIViewController {
}
@property (strong, nonatomic) MyFramework * myframework;
- (void) onSuccess : (NSString *) value;
- (void) onError : (NSString *) reason : (NSString *) error;
@end
.
// In ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void) viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.myframework = [[MyFramework alloc] init];
[self.myframework MyMethod : self onSuccess, self onError];
}
- (void) onSuccess : (NSString *) value {
// ...
}
- (void) onError : (NSString *) reason : (NSString *) error {
// ...
}
@end
这一行 [self.myframework MyMethod : self onSuccess, self onError]; 不起作用。 Xcode 在 onSuccess 之后说期望标识符“:”,然后期望表达式。我不确定要插入什么。我读了几个关于stackoverflow如何在objective-c中将方法作为参数传递但没有成功的答案。例如,我尝试过选择器 [self.myframework MyMethod : @selector(onSuccess:), @selector(onError::)]; 但 Xcode 说:“将 'SEL' 发送到不兼容类型的参数' void(^_Nonnull)(NSString * _Nonnull __strong)'
【问题讨论】:
-
在文件 MyFramework.framework/Headers/MyFramework-Swift.hi 中看到 MyMethod 在objective-c中声明为: - (void)MyMethod:(void (^ _Nonnull)(NSString * _Nonnull))successCallback;(没有errorCallback)和第二种选择:- (void)MyMethod:(void (^ _Nonnull)(NSString * _Nonnull))successCallback errorCallback:(void (^ _Nonnull)(NSString * _Nonnull, NSString * _Nonnull))errorCallback;
标签: ios objective-c swift function