gpt4 book ai didi

ios - 从单 View 应用程序 (objective-c) 调用以函数作为 Cocoa Touch Framework (swift) 参数的方法

转载 作者:行者123 更新时间:2023-11-30 13:15:56 25 4
gpt4 key购买 nike

我创建了Cocoa Touch Frameworkswift (称为我的框架)。在 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");
});
}
}

我可以包括MyFrameworkSingle View ApplicationMyAppSwift (在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) {
// ...
}
}

我可以包括MyFrameworkSingle View ApplicationMyAppObjectiveC (在objective-c中)但我不知道如何调用MyMethod MyFramework 的 ViewController.m ...

// 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 How to pass method as argument in Objective-C 上读到了几个答案,但没有成功。例如,我尝试过选择器 [self.myframework MyMethod : @selector(onSuccess:), @selector(onError::)]; 但 Xcode 说:“将 'SEL' 发送到不兼容类型的参数 ' void(^_Nonnull)(NSString * _Nonnull __strong)'

最佳答案

正如您所指出的,根据 *-Swift.h header ,Swift 的 MyMethod 被导入到 Objective-C 中,并将 blocks 作为论据。因此,您需要传递包装 Objective-C 方法调用的 block ,如下所示:

[self.myframework MyMethod: ^ (NSString * s){ [self onSuccess:s]; }
errorCallback: ^(NSString * s1, NSString * s2) { [self onError:s1:s2]; }];

有关 Objective-C block 的更多信息,请参见此处:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

关于ios - 从单 View 应用程序 (objective-c) 调用以函数作为 Cocoa Touch Framework (swift) 参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38217379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com