Добавление собственного кода Swift в приложение NativeScript - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь добавить нативный код swift в мое приложение NativeScript. Согласно этим инструкциям в документации, я могу просто добавить исходный файл swift в App_Resources/iOS/src/ и затем использовать любые открытые классы прямо в моем коде TypeScript. К сожалению, это просто не работает. Я просто получу Cannot find name 'TestClass' и все.

Шаги для воспроизведения:

  1. Получите проект fre sh NS с ios tns create my-app-name --template tns-template-blank-ts

Обновление : Я действительно создал приложение с vue init nativescript-vue/vue-cli-template testapp. Кажется, это вызвало проблемы.

Добавить TestClass.swift к App_Resources/iOS/src/
import Foundation

public class TestClass: NSObject {
    @objc public func echo(param: String) -> String {
        return param
    }
}
Создание экземпляра в любом исходном файле TypeScript let instance = new TestClass() Do tns debug ios Компиляция завершится с Cannot find name 'TestClass'

Я также попытался сгенерировать Наберите TypeScript с помощью TNS_TYPESCRIPT_DECLARATIONS_PATH="$(pwd)/typings" tns build ios или просто разделите его как любой с declare let KeyCommander: any;, чтобы исключить вероятность того, что это проблема, связанная с TS. Первый подход не генерирует никаких типизаций для моего пользовательского класса, поэтому код TypeScript все равно не будет компилироваться. Второй подход позволяет компилировать код TS, но происходит сбой при выполнении с JS ERROR ReferenceError: Can't find variable: TestClass.

. Я также проверил, что файл swift действительно компилируется, вставив синтаксическую ошибку, которая вызовет sh процесс сборки.

Моя версия NativeScript 6.4.0.

Что мне не хватает?

Обновление : я только что понял, что на самом деле создал приложение с vue init nativescript-vue/vue-cli-template testapp. Я подтвердил, что, как уже упоминалось, ответ Тайлера Блейка в приложении, созданном с помощью tns cli, описанный процесс действительно работает. В приложении, которое я только что создал с vue init, это не так, objc!nsswiftsupport.d.ts не генерируется.

Теперь вопрос: что вызывает разницу?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Я выполнил ваши шаги и смог получить набор для генерации в objc!nsswiftsupport.d.ts. После того, как вы сгенерируете набор текста, есть ли у вас этот файл с этим содержимым?

declare class TestClass extends NSObject {

    static alloc(): TestClass; // inherited from NSObject

    static new(): TestClass; // inherited from NSObject

    echoWithParam(param: string): string;
}

Это показывает, что NS может подобрать код Swift.

Все, что вам нужно сделать сейчас, это добавить tns-platform-declarations, затем в файле references.d.ts добавить строку это указывает на файл objc!nsswiftsupport.d.ts. Тогда вы получите intellisense в вашем коде TS.

Примерно так:

/// <reference path="./typings/objc!nsswiftsupport.d.ts" />

Надеюсь, это поможет!

0 голосов
/ 20 февраля 2020

Мне удалось решить проблему, проверив различия между шаблонами, созданными с помощью tns-cli и vue init. Разница в том, что шаблон vue init поставляется с устаревшей версией платформы nativescript. Вы можете просто изменить

"tns-ios": {
  "version": "6.0.1"
}

на версию 6.4.0 (с которой поставляется шаблон tns-cli), и тогда процесс будет работать, как описано в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...