3

我正在尝试在 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该类,但似乎无法引用该类的shared静态属性Siren。我已经尝试过[Siren shared]Siren.shared但都没有工作。这是Siren该类的前几行:

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,但我找不到任何与访问static let类的属性特别相关的内容。我发现这个有用的答案,但它提到了全局变量,而不是静态类属性。

4

1 回答 1

2

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

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

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

  • 通过 GitHub issue 让作者知道;
  • 同时,您可以制作自己的 Swift 类包装器,将每次调用都指向 Siren,创建内部指针Siren.shared,从 Siren 复制粘贴所有 getter-setter,代理调用 real Siren.shared
  • 将您的班级标记为@objc
  • 当(如果)作者解决问题时,您可以更新 Siren,删除您的类包装器并直接调用 Siren。
于 2019-06-03T21:50:32.547 回答