在 Objective-C iOS 应用程序中使用 Swift 项目(警报器)

Using Swift Project (Siren) in an Objective-C iOS Application

我正在尝试在 iOS Objective-C 应用程序中使用流行的 swift 库 Siren。我已经将库作为使用 cocoapods 的框架包含在内,我 运行 pod init 然后 pod install 使用这样的 podfile:

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'MyObjectiveCApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for MyObjectiveCApp
  pod 'Siren'

end

并且我已经将 swift 代码导入到 AppDelegate.m 文件中,如下所示:

#import <Siren/Siren-Swift.h>

我现在可以访问 Siren class,但我似乎无法引用 Siren [=] 上的 shared 静态 属性 class。我试过 [Siren shared]Siren.shared 但都不起作用。这是 Siren class 的前几行:

import UIKit

/// The Siren Class.
public final class Siren: NSObject {
    /// Return results or errors obtained from performing a version check with Siren.
    public typealias ResultsHandler = (Result<UpdateResults, KnownError>) -> Void

    /// The Siren singleton. The main point of entry to the Siren library.
    public static let shared = Siren()

是否有任何在 Objective-C iOS 应用程序中使用 Siren 的文档或示例?这可能吗?我知道我可以使用 Harpy,但由于不再支持它,所以我尽量避免使用它。我研究过在 Objective-C 代码中使用 Swift,但我找不到任何与访问 class 上的 static let 属性 相关的内容。我找到了 this helpful answer,但它提到了全局变量,而不是静态 class 属性。

你不能访问shared 属性的原因是因为它没有导出到Siren-Swift.h头文件(你可以检查生成的头文件)。

那是因为 Siren class 没有明确标记为 @objc。 class 本身是导出的,因为它是 NSObject 的子 class,但默认情况下不导出属性。我想我们不能自己解决它。

我们可以做的是解决方法:

  • 通过GitHub问题让作者知道;
  • 与此同时,您可以创建自己的 Swift class-wrapper,将每次调用都引导至引擎盖下的 Siren,创建指向 Siren.shared、copy-paste 所有 getters-setters 来自 Siren,代理调用真实 Siren.shared;
  • 将您的 class 标记为 @objc;
  • 作者何时(以及是否)解决问题,您可以更新 Siren,删除您的 class-wrapper 并直接调用 Siren。