Использование проекта Swift (Siren) в iOS-приложении Objective-C - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь использовать популярную библиотеку swift, Siren , в приложении iOS Objective-C. Я включил библиотеку в качестве фреймворка, используя cocoapods, я запустил pod init, а затем pod install с таким подфайлом, как это:

# 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()

Есть ли документация или примеры использования сирены в iOS-приложении Objective-C? Это возможно? Я знаю, что могу использовать гарпию, но так как она больше не поддерживается, я старался избегать ее, если это возможно. Я исследовал использование Swift в коде Objective-C, но не смог найти ничего, связанного с доступом к свойству static let в классе. Я нашел этот полезный ответ , но в нем упоминаются глобальные переменные, а не статические свойства класса.

1 Ответ

1 голос
/ 04 июня 2019

Причина, по которой вы не можете получить доступ к свойству shared, заключается в том, что оно не экспортируется в заголовок Siren-Swift.h (вы можете проверить созданный файл заголовка).

Это потому, что класс Siren не являетсяявно помечен как @objc.Сам класс экспортируется, потому что это подкласс NSObject, но свойства не экспортируются по умолчанию.Я думаю, что мы не можем решить это самостоятельно.

То, что мы можем сделать, это обходной путь:

  • Сообщите автору через проблему GitHub;
  • Втем временем вы можете создать свою собственную оболочку класса Swift, которая будет направлять каждый вызов Siren изнутри, создавать внутренний указатель на Siren.shared, копировать и вставлять все получатели-установщики из Siren, прокси-вызовы в реальные Siren.shared;
  • Отметьте свой класс как @objc;
  • Когда (и если) автор решит проблему, вы можете обновить Siren, удалить класс-оболочку и вызвать Siren напрямую.
...