Как получить доступ к чистой библиотеке Swift Stati c из проекта чистого Swift? - PullRequest
2 голосов
/ 23 января 2020

У меня есть библиотека stati c в Swift, и я хочу получить доступ к этому классу библиотеки из другого проекта Swift. Класс в библиотеке не может быть правильно указан.

Моя статистика c Библиотека с именем StaticLib содержит иерархию,

Стати c Библиотечный проект - Иерархия

StaticLib (project)
   StaticLib 
       StaticLib.swift
   Products
       libStaticLib.a

Stati c Библиотечный проект - StaticLib.swift

public class StaticLib {

    public class func test(string: String) {
        Printer().printMe(string: string)
    }
}

class Printer {

    func printMe(string: String){
        print("This is test tring: \(string)")
    }
}

Хост-приложение - AppDelegate.swift

import StaticLib

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        StaticLib.test("How do you do?") // error

        return true
    }
}

Шаги, которые я сделал -

  1. Щелкните проект в Xcode Project Navigator
  2. Нажмите + , чтобы добавить новую цель
  3. Выберите Каркасы и библиотеки> Stati c Библиотека> Далее
  4. Введите имя StaticLib (в Swift)> Fini sh
  5. Откройте StaticLib.swift и введите
    public class StaticLib {

        public class func test(string: String) {
            Printer().printMe(string: string)
        }
    }

    class Printer {

        func printMe(string: String){
            print("This is test tring: \(string)")
        }
    }
Выберите StaticLib схема, Сборка> OK Скопируйте libStaticLib.a в новую папку с именем HostApp/Libs/ Выберите проект в Навигаторе проектов> щелкните цель основного приложения> выберите Общие В разделе Framework, Libraries и Embedded Content нажмите, я вижу, libStaticLib.a уже добавлен Xcode Intelligence Выберите схему основного приложения> Build> OK Выберите AppDelegate.swift> Добавить import StaticLib Добавить
    StaticLib.test("How do you do?")
Попробуйте создать

Ошибка компиляции:

Использование неразрешенного идентификатора 'StaticLib'

Как решить Эта проблема? Нужно ли создавать какой-либо заголовочный файл в библиотеке?

Примечание: Я успешно внедрил libStaticLib.a, и он присутствует во вкладке "Хост-приложения" General -> Frameworks, Libraries and Embedded contents.

1 Ответ

1 голос
/ 23 января 2020

Я прошел ваши шаги и все работает, по крайней мере, в Xcode 11.3.1 / iOS 13.3. Единственное ... кажется ... см. Комментарий

import StaticLib // << looks like you've forgot this one !!!

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        StaticLib.test("How do you do?") // error

        return true
    }
}

Обновление: Вот мои шаги -

  1. Нажмите проект в Xcode Project Navigator
  2. Нажмите + , чтобы добавить новую цель
  3. Выберите Каркасы и библиотеки> Stati c Библиотека> Далее
  4. Введите имя StaticLib (на языке Swift)> Fini sh
  5. Откройте StaticLib.swift и введите
    public class StaticLib {
        public class func printme() {
            print("I'm swfit static lib!")
        }
    }
Выберите StaticLib схема, Построить> ОК Выберите проект в Навигаторе проекта> щелкните цель основного приложения> выберите Общие В разделе Framework, Библиотеки и встроенный контент щелкните + и выберите libStaticLib.a> Добавить Выберите схему основного приложения> Создать> ОК Выберите AppDelegate.swift> добавить import StaticLib Добавить в любом месте кода
    StaticLib.printme()
Build> OK> Run ... см. Вывод

Update2: для внешнего проекта Lib

+ 1 Необходимо скопировать StaticLib.swiftmodule (он создается в том же месте, что и libStaticLib.a) в папку целевого проекта (я поместил его на уровне файла .xcodeproj)

+ 2 В основной цели приложения Build Settings установите SWIFT_INCLUDE_PATHS = ${SRCROOT}

+ 3 Очистить> Построить

Примечание: индикатор того, что загруженный модуль является автозаполнением для импорта, должен показывать StaticLib

...