如何将AppDelegate Swift代码放入Objective-C AppDelegate文件并使其工作?

时间:2019-03-28 16:56:09

标签: ios swift appdelegate bridging-header

我正在尝试使用适用于iOS的Amazon Web Serivces SDK(称为AWSAppSync)。我找到了good instructions for Swift。 我将尝试使这个问题对所有Obj-c / Swift桥接问题更为笼统:

AppDelegate.Swift文件有一个代码段。但是,我的AppDelegate在Objective-C中。我已经将其放入Swift文件中的函数(称为awsConfig)中,在Bridging-Header.h中引用了该文件,并从我的AppDelegate.m中调用了Swift文件中的函数:

// AppDelegate.m
#import "<ProductModuleName>-Swift.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    appsyncer *syncClass = [appsyncer new];
    [syncClass awsConfig];

    return YES;
}

这是Swift文件中的代码段。

// SwiftAppDelegateExtension.Swift 
var appSyncClient: AWSAppSyncClient?

    do {
        // You can choose the directory in which AppSync stores its persistent cache databases
        let cacheConfiguration = try AWSAppSyncCacheConfiguration()

        // AppSync configuration & client initialization
        let appSyncServiceConfig = try AWSAppSyncServiceConfig()
        let appSyncConfig = try AWSAppSyncClientConfiguration(appSyncServiceConfig: appSyncServiceConfig,
                                                              cacheConfiguration: cacheConfiguration)
        appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig)

    } catch {
        print("Error initializing appsync client. \(error)")
    }

当我想在另一个Swift文件中使用它时,如下所示:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appSyncClient = appDelegate.appSyncClient

我得到了错误:

(!)类型为'AppDelegate'的值没有成员'appSyncClient'

为什么这行不通?如果我的解决方法太丑陋,那么解决这个问题的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

这可能是由于您当前正在使用的版本,因为此问题可能与您使用的版本有关。因此,请尝试先使用其他版本,因为这曾经发生在我身上,而我只是使用了旧版本,因为编译器稍有更改,因此,如果您可以尝试使用其他版本,然后让我知道并确保对报告进行报告。您尝试的版本失败了。

答案 1 :(得分:0)

我发现答案是一个小错误:原来我在桥接头文件中放了appDelegate.h而不是appDelegate.m。更改后可以正常工作。将Swift代码转换为目标C可能是一个更好的选择,但是如果您不像我这样精通两种语言,这会更容易。