【问题标题】:Adding native swift code to NativeScript application将本机 swift 代码添加到 NativeScript 应用程序
【发布时间】:2020-06-03 18:07:38
【问题描述】:

我正在尝试将本机 swift 代码添加到我的 NativeScript 应用程序中。根据文档中的这些instructions,我可以将一个快速源文件添加到App_Resources/iOS/src/,然后直接在我的TypeScript代码中使用任何公开的类。 不幸的是,这不起作用。我会得到Cannot find name 'TestClass' 就可以了。

重现步骤:

  1. 使用 ios tns create my-app-name --template tns-template-blank-ts 获取新的 NS 项目

更新:我实际上是用vue init nativescript-vue/vue-cli-template testapp 创建的应用程序。这似乎导致了问题。

  1. TestClass.swift 添加到App_Resources/iOS/src/
import Foundation

public class TestClass: NSObject {
    @objc public func echo(param: String) -> String {
        return param
    }
}
  1. 在任何 TypeScript 源文件中实例化它let instance = new TestClass()
  2. tns debug ios
  3. 编译将失败并显示Cannot find name 'TestClass'

我还尝试使用 TNS_TYPESCRIPT_DECLARATIONS_PATH="$(pwd)/typings" tns build ios 生成 TypeScript 类型,或者只是使用 declare let KeyCommander: any; 将其删除,以消除这是与 TS 相关的问题的可能性。第一种方法不会为我的自定义类生成任何类型,因此 TypeScript 代码仍然无法编译。第二种方法让我们编译 TS 代码,但在使用 JS ERROR ReferenceError: Can't find variable: TestClass 执行时崩溃。

我还验证了 swift 文件确实是通过插入一个会使构建过程崩溃的语法错误来编译的。

我的 NativeScript 版本是6.4.0

我错过了什么?

更新:我刚刚意识到我实际上是使用vue init nativescript-vue/vue-cli-template testapp 创建的应用程序。我验证了在使用 tns cli 创建的应用程序中提到的Tyler Blake's answer 所描述的过程确实有效。在我刚刚使用 vue init 创建的应用程序中,它没有,objc!nsswiftsupport.d.ts 没有生成。

现在的问题是:造成这种差异的原因是什么?

【问题讨论】:

    标签: ios swift typescript vue.js nativescript


    【解决方案1】:

    我按照您的步骤操作,并且能够在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 文件的行。然后你会在你的 TS 代码中获得智能感知。

    类似这样的:

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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的尝试!您确实是对的,我描述的过程确实有效。我刚刚意识到我使用 vue init 创建了应用程序,如 nativescript-vue 文档中所述。在使用vue init 创建的样板应用程序中,不会生成objc!nsswiftsupport.d.ts。我真的说不出有什么不同。可以吗?
    • 没关系。不同之处在于模板附带的“tns-ios”版本。不过感谢您的帮助!
    • 没问题,很高兴你明白了!
    【解决方案2】:

    我能够通过检查使用tns-clivue init 创建的模板之间的差异来解决问题。不同之处在于vue init 模板附带了一个过时的nativescript 平台版本。你可以简单地改变

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

    到版本6.4.0tns-cli 模板附带的版本),然后该过程将按照文档中的说明进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多