Доступ к предварительно скомпилированному Swift.Framework из статической библиотеки ObjectiveC - PullRequest
1 голос
/ 03 октября 2019

У меня есть предварительно скомпилированная фреймворк Swift, назовем его SomeCoolSwiftFramework (нет доступа к исходному коду, только фреймворк), который мне нужно использовать в моей собственной статической библиотеке Objective-C (это требование в моем сценарии)). Я создал статическую библиотеку Objective-C, назовем ее MyCoolObjCLibrary, перетащил туда фреймворк и создал новый класс, в котором я хочу использовать фреймворк:

@import Foundation;
@import SomeCoolSwiftFramework;
#import <SomeCoolSwiftFramework/SomeCoolSwiftFramework-Swift.h>
#import "MyCoolObjCLibrary.h"


@implementation MyCoolObjCLibrary

- testMe: NSString {
    // I want to access classes from SomeCoolSwiftFramework here but cannot see them.
    // `SomeCoolSwiftFramework` is not accessible here
    return @"ObjC Value";
}

@end

Если вместо этогоПри создании статической библиотеки ObjC я переключаюсь на быструю статическую библиотеку, она отлично работает, я вижу необходимые классы и методы. Но в моем случае я вынужден использовать статическую библиотеку ObjC, поэтому хочу понять, как я могу получить доступ к swift Framework из статической библиотеки.

Я пропустил какие-либо шаги при добавлении зависимости в 3d-каркас детали

1 Ответ

2 голосов
/ 04 октября 2019

Оказалось, что, поскольку сторонний SDK SomeCoolSwiftFramework не следовал правилам для правильного представления необходимых классов, используемых ObjC, сгенерированный заголовок не имел требуемых объявлений, и я не смог их увидеть.

Правила для членов Swift, которые будут использоваться ObjC:

  • класс или член, помеченный public
  • класс наследует NSObject
  • класс, помеченный objc(<name>)
  • член, помеченный objc

Чтобы преодолеть это ограничение трехмерной сторонней платформы, я создал свою собственную быстродействующую структуруSomeCoolSwiftFrameworkProxy с зависимостью от сторонней организации раскрыл весь API, требуемый моим кодом, применил правила выше и убедился, что SomeCoolSwiftFrameworkProxy-Swift.h правильно сгенерирован и имеет требуемые объявления. После его завершения я смог импортировать сгенерированный файл SomeCoolSwiftFrameworkProxy-Swift.h в мою статическую библиотеку ObjC (или в любое другое место в моем коде ObjC) и получить доступ к необходимым классам / методам прокси.

Ниже описана моя структура прокси Swift:

import Foundation;
import SomeCoolSwiftFramework;

@objc(SomeCoolSwiftFrameworkProxy)
public class SomeCoolSwiftFrameworkProxy : NSObject {

    @objc
    public func init() {
        // access 3d party SDK methods/classes
        SomeCoolSwiftFrameworkClass.sharedInstance.init()
    }
}

Я нашел это сообщение в блоге , которое отвечает на мой вопрос

...