提交 cf0701c5 编写于 作者: D DCloud_LXH

fix: issue #1674

上级 2333f33c
...@@ -118,7 +118,7 @@ class XXX{ ...@@ -118,7 +118,7 @@ class XXX{
``` ```
### 2.4 线程环境差异 ### 2.4 线程环境差异 @thread-environment
UTS环境中,默认是没有线程概念的。 UTS环境中,默认是没有线程概念的。
...@@ -1304,4 +1304,3 @@ function getAppName(context : Context) : string { ...@@ -1304,4 +1304,3 @@ function getAppName(context : Context) : string {
### android原生资源文件,暂不支持三方库依赖 ### android原生资源文件,暂不支持三方库依赖
比如xml布局文件中暂时只支持 linearlayout等官方标签,不支持 appcompat等三方库标签。这个问题后续会被处理 比如xml布局文件中暂时只支持 linearlayout等官方标签,不支持 appcompat等三方库标签。这个问题后续会被处理
...@@ -32,7 +32,7 @@ UTS 插件是 uni-app 新型插件形式 [详情](/plugin/uts-plugin) ...@@ -32,7 +32,7 @@ UTS 插件是 uni-app 新型插件形式 [详情](/plugin/uts-plugin)
UTS 和 swift 在数据类型上基本保持了一致,但是在部分场景下,还是会有差异,在此特别说明 UTS 和 swift 在数据类型上基本保持了一致,但是在部分场景下,还是会有差异,在此特别说明
原则上: 原则上:
**数据类型以 UTS 内置的类型为准, 各原生平台都会对其自动适配。** **数据类型以 UTS 内置的类型为准, 各原生平台都会对其自动适配。**
...@@ -50,7 +50,7 @@ UTS 中不存在 Int、Float、Double 类型开发者在开发过程中应该使 ...@@ -50,7 +50,7 @@ UTS 中不存在 Int、Float、Double 类型开发者在开发过程中应该使
下面以一个协议方法为例,需要实现一个三方依赖库中定义的协议方法 下面以一个协议方法为例,需要实现一个三方依赖库中定义的协议方法
```swift ```swift
// swift // swift
// 此协议定义在其他三方 SDK 中 // 此协议定义在其他三方 SDK 中
protocol TestProtocol { protocol TestProtocol {
func addTwoInts(_ a: Int, _ b: Int) -> Int func addTwoInts(_ a: Int, _ b: Int) -> Int
...@@ -223,17 +223,17 @@ console.log(lib.version); ...@@ -223,17 +223,17 @@ console.log(lib.version);
- 将需要暴露的 public 文件 导入到 `TestSDK.h` 中,如 `#import <TestSDK/TestA.h>`; - 将需要暴露的 public 文件 导入到 `TestSDK.h` 中,如 `#import <TestSDK/TestA.h>`;
-`target` -> `Build Phases` -> `Headers` 中将刚创建的 `TestSDK.h` 设置为 `public`; -`target` -> `Build Phases` -> `Headers` 中将刚创建的 `TestSDK.h` 设置为 `public`;
- 重新编译 SDK, 编译后可以看到 Modules 已经生成。 - 重新编译 SDK, 编译后可以看到 Modules 已经生成。
+ 通过自定义 Module Map 的方式: + 通过自定义 Module Map 的方式:
- 打开 XCode, 在 `TestSDK` SDK 源码目录下创建 ` module.map.modulemap ` 文件; - 打开 XCode, 在 `TestSDK` SDK 源码目录下创建 ` module.map.modulemap ` 文件;
- 在上述文件中键入下面代码中类似的内容,下述代码是以 `TestSDK` 为例,实践时需要改为自己的 SDK 和文件名; - 在上述文件中键入下面代码中类似的内容,下述代码是以 `TestSDK` 为例,实践时需要改为自己的 SDK 和文件名;
-`target` -> `Build Settings` -> `Module Map File` 设置 `Module Map File``$(PROJECT_DIR)/TestSDK/module.map.modulemap`; -`target` -> `Build Settings` -> `Module Map File` 设置 `Module Map File``$(PROJECT_DIR)/TestSDK/module.map.modulemap`;
- 重新编译 SDK, 编译后可以看到 Modules 已经生成。 - 重新编译 SDK, 编译后可以看到 Modules 已经生成。
```ts ```ts
framework module TestSDK { framework module TestSDK {
header "TestA.h" //需要对外暴露的头文件,需要为 plubic 的文件 header "TestA.h" //需要对外暴露的头文件,需要为 plubic 的文件
header "TestB.h" //需要对外暴露的头文件,需要为 plubic 的文件 header "TestB.h" //需要对外暴露的头文件,需要为 plubic 的文件
export * export *
...@@ -241,7 +241,7 @@ framework module TestSDK { ...@@ -241,7 +241,7 @@ framework module TestSDK {
``` ```
##### 无源码的情况 ##### 无源码的情况
如果使用的是第三方非开源的 SDK, 那么可以使用下面的方式来生成 Modules: 如果使用的是第三方非开源的 SDK, 那么可以使用下面的方式来生成 Modules:
`TestSDK` 为例: `TestSDK` 为例:
...@@ -250,20 +250,20 @@ framework module TestSDK { ...@@ -250,20 +250,20 @@ framework module TestSDK {
+ 在上述文件中键入下述的代码(其中的 .h 文件都要是 TestSDK.framework -> Headers 文件夹里的头文件)。 + 在上述文件中键入下述的代码(其中的 .h 文件都要是 TestSDK.framework -> Headers 文件夹里的头文件)。
+ 至此 TestSDK 就可以直接放在 uts 插件中使用了。 + 至此 TestSDK 就可以直接放在 uts 插件中使用了。
> 注意: > 注意:
> 实践时要将 `TestSDK` 改成你要操作的 SDK 名称,.h 文件也要改成你要暴露的头文件名字。 > 实践时要将 `TestSDK` 改成你要操作的 SDK 名称,.h 文件也要改成你要暴露的头文件名字。
```ts ```ts
framework module TestSDK { framework module TestSDK {
// 下面的.h 文件都要是 TestSDK.framework -> Headers 文件夹下的头文件 // 下面的.h 文件都要是 TestSDK.framework -> Headers 文件夹下的头文件
header "AClass.h" header "AClass.h"
header "BClass.h" header "BClass.h"
header "CClass.h" header "CClass.h"
header "DClass.h" header "DClass.h"
export * export *
} }
...@@ -300,26 +300,26 @@ import { UTSiOS } from "DCloudUTSFoundation" ...@@ -300,26 +300,26 @@ import { UTSiOS } from "DCloudUTSFoundation"
export function showAlert(title: string|null, message: string|null, result: (index: Number) => void) { export function showAlert(title: string|null, message: string|null, result: (index: Number) => void) {
// uts方法默认会在子线程中执行,涉及 UI 操作必须在主线程中运行,通过 DispatchQueue.main.async 方法可将代码在主线程中运行 // uts方法默认会在子线程中执行,涉及 UI 操作必须在主线程中运行,通过 DispatchQueue.main.async 方法可将代码在主线程中运行
DispatchQueue.main.async(execute=():void => { DispatchQueue.main.async(execute=():void => {
// 初始化 UIAlertController 实例对象 alert // 初始化 UIAlertController 实例对象 alert
let alert = new UIAlertController(title=title,message=message,preferredStyle=UIAlertController.Style.alert) let alert = new UIAlertController(title=title,message=message,preferredStyle=UIAlertController.Style.alert)
// 创建 UIAlertAction 按钮 // 创建 UIAlertAction 按钮
let okAction = new UIAlertAction(title="确认", style=UIAlertAction.Style.default, handler=(action: UIAlertAction):void => { let okAction = new UIAlertAction(title="确认", style=UIAlertAction.Style.default, handler=(action: UIAlertAction):void => {
// 点击按钮的回调方法 // 点击按钮的回调方法
result(0) result(0)
}) })
// 创建 UIAlertAction 按钮 // 创建 UIAlertAction 按钮
let cancelAction = new UIAlertAction(title="取消", style=UIAlertAction.Style.cancel, handler=(action: UIAlertAction):void => { let cancelAction = new UIAlertAction(title="取消", style=UIAlertAction.Style.cancel, handler=(action: UIAlertAction):void => {
// 点击按钮的回调方法 // 点击按钮的回调方法
result(1) result(1)
}) })
// 将 UIAlertAction 添加到 alert 上 // 将 UIAlertAction 添加到 alert 上
alert.addAction(okAction) alert.addAction(okAction)
alert.addAction(cancelAction) alert.addAction(cancelAction)
// 打开 alert 弹窗 // 打开 alert 弹窗
UTSiOS.getCurrentViewController().present(alert, animated= true) UTSiOS.getCurrentViewController().present(alert, animated= true)
}) })
...@@ -339,9 +339,9 @@ export function showAlert(title: string|null, message: string|null, result: (ind ...@@ -339,9 +339,9 @@ export function showAlert(title: string|null, message: string|null, result: (ind
- RGB 如:rgb(255, 0, 0) - RGB 如:rgb(255, 0, 0)
- RGBA 如:rgba(255, 0, 0, 0.5) - RGBA 如:rgba(255, 0, 0, 0.5)
- 色值关键字,如: red - 色值关键字,如: red
示例 示例
```ts ```ts
let bgColor = UTSiOS.colorWithString("#000000") let bgColor = UTSiOS.colorWithString("#000000")
view.backgroundColor = bgColor view.backgroundColor = bgColor
...@@ -353,9 +353,9 @@ view.backgroundColor = bgColor ...@@ -353,9 +353,9 @@ view.backgroundColor = bgColor
获取指定插件资源的运行期绝对路径 获取指定插件资源的运行期绝对路径
插架资源路径请传该资源在工程目录下的绝对路径 插架资源路径请传该资源在工程目录下的绝对路径
示例 示例
```ts ```ts
const imagePath = UTSiOS.getResourcePath("/static/logo.png") const imagePath = UTSiOS.getResourcePath("/static/logo.png")
console.log(imagePath) console.log(imagePath)
...@@ -439,7 +439,7 @@ var alert = new UIAlertController() ...@@ -439,7 +439,7 @@ var alert = new UIAlertController()
var alert = UIAlertController(title: "提示", message: "提示内容", preferredStyle: .alert); var alert = UIAlertController(title: "提示", message: "提示内容", preferredStyle: .alert);
``` ```
```ts ```ts
// uts 中写法 // uts 中写法
let alert = new UIAlertController(title="提示", message="提示内容", preferredStyle=UIAlertController.Style.alert) let alert = new UIAlertController(title="提示", message="提示内容", preferredStyle=UIAlertController.Style.alert)
...@@ -454,7 +454,7 @@ let alert = new UIAlertController(title="提示", message="提示内容", prefer ...@@ -454,7 +454,7 @@ let alert = new UIAlertController(title="提示", message="提示内容", prefer
.alert .alert
``` ```
在 uts 中需要完整的写出 在 uts 中需要完整的写出
```ts ```ts
UIAlertController.Style.alert UIAlertController.Style.alert
...@@ -495,7 +495,7 @@ swift 中定义子类继承父类时需要在子类名称后加上父类名称 ...@@ -495,7 +495,7 @@ swift 中定义子类继承父类时需要在子类名称后加上父类名称
```swift ```swift
// swift // swift
class Son: Father { class Son: Father {
} }
``` ```
...@@ -522,7 +522,7 @@ uts 中需要使用`implements`关键字代替冒号 `:` ...@@ -522,7 +522,7 @@ uts 中需要使用`implements`关键字代替冒号 `:`
```ts ```ts
class SomeClass implements FirstProtocol, AnotherProtocol { class SomeClass implements FirstProtocol, AnotherProtocol {
} }
``` ```
...@@ -533,7 +533,7 @@ swift 中系统版本判断的方法 ...@@ -533,7 +533,7 @@ swift 中系统版本判断的方法
```swift ```swift
// swift // swift
if #available(iOS 10.0, *) { if #available(iOS 10.0, *) {
} }
``` ```
...@@ -552,7 +552,7 @@ swift 中闭包可以简写 ...@@ -552,7 +552,7 @@ swift 中闭包可以简写
```swift ```swift
// swift 中最后一个参数如果是闭包称作为尾随闭包,可以忽略参数标签类型等简写为下面的方式 // swift 中最后一个参数如果是闭包称作为尾随闭包,可以忽略参数标签类型等简写为下面的方式
let action = UIAlertAction(title: "确认", style: .default) { action in let action = UIAlertAction(title: "确认", style: .default) { action in
} }
``` ```
...@@ -626,7 +626,7 @@ map.set("name","uts") ...@@ -626,7 +626,7 @@ map.set("name","uts")
以 hello uts 中腾讯定位为例,监听位置变化时需要实现协议方法: 以 hello uts 中腾讯定位为例,监听位置变化时需要实现协议方法:
`tencentLBSLocationManager(_ manager: TencentLBSLocationManager, didUpdate location: TencentLBSLocation)` `tencentLBSLocationManager(_ manager: TencentLBSLocationManager, didUpdate location: TencentLBSLocation)`
此方法第二个参数存在 `didUpdate` 参数标签 此方法第二个参数存在 `didUpdate` 参数标签
原生 swift 中的实现为 原生 swift 中的实现为
...@@ -664,7 +664,7 @@ tencentLBSLocationManager(manager: TencentLBSLocationManager, @argumentLabel("di ...@@ -664,7 +664,7 @@ tencentLBSLocationManager(manager: TencentLBSLocationManager, @argumentLabel("di
#### 5.1.12.1 无参数标签 #### 5.1.12.1 无参数标签
只写参数名称的参数,编译后会在参数前默认增加 `_` 来忽略参数标签(如上面的示例,第一个参数 manager,这种方式能兼容绝大多数方法,尤其是Swift 调用 OC 方法),但是有些参数没有参数标签,默认添加 `_` 的行为会和原生方法定义不一致,这种情况需要定义一个空的参数标签来解决 `@argumentLabel("didUpdate")` 只写参数名称的参数,编译后会在参数前默认增加 `_` 来忽略参数标签(如上面的示例,第一个参数 manager,这种方式能兼容绝大多数方法,尤其是Swift 调用 OC 方法),但是有些参数没有参数标签,默认添加 `_` 的行为会和原生方法定义不一致,这种情况需要定义一个空的参数标签来解决 `@argumentLabel("didUpdate")`
以高德定位 SDK 的代理方法为例:第三个参数 reGeocode 只有参数名称,没有参数标签 以高德定位 SDK 的代理方法为例:第三个参数 reGeocode 只有参数名称,没有参数标签
...@@ -682,12 +682,12 @@ amapLocationManager(manager : AMapLocationManager, @argumentLabel("didUpdate") l ...@@ -682,12 +682,12 @@ amapLocationManager(manager : AMapLocationManager, @argumentLabel("didUpdate") l
} }
``` ```
#### 5.1.13 异步方法 #### 5.1.13 异步方法 @async-method
swift 标记某个函数或者方法是异步的,你可以在它的声明中的参数列表后边加上 `async` 关键字 swift 标记某个函数或者方法是异步的,你可以在它的声明中的参数列表后边加上 `async` 关键字
```swift ```swift
// swift // swift
@available(iOS 13.0.0, *) @available(iOS 13.0.0, *)
func testAsync(_ opts: AsyncOptions) async -> UTSJSONObject { func testAsync(_ opts: AsyncOptions) async -> UTSJSONObject {
if (opts.type == "success") { if (opts.type == "success") {
...@@ -730,7 +730,7 @@ swift中try有以下三种方式: ...@@ -730,7 +730,7 @@ swift中try有以下三种方式:
1. 使用try (注意:要和do {} catch {} 一起使用,捕获可能的异常) 1. 使用try (注意:要和do {} catch {} 一起使用,捕获可能的异常)
```swift ```swift
// swift // swift
do{ do{
let dict = try JSONSerialization.jsonObject(with: d, options: []) let dict = try JSONSerialization.jsonObject(with: d, options: [])
print(dict) print(dict)
...@@ -744,7 +744,7 @@ swift中try有以下三种方式: ...@@ -744,7 +744,7 @@ swift中try有以下三种方式:
2. 使用try? 如果能发序列化成功,就返回成功的值,不能成功就返回nil 2. 使用try? 如果能发序列化成功,就返回成功的值,不能成功就返回nil
```swift ```swift
// swift // swift
// 注意:dict是个可选值 // 注意:dict是个可选值
let dict = try? JSONSerialization.jsonObject(with: data, options: []) let dict = try? JSONSerialization.jsonObject(with: data, options: [])
...@@ -753,7 +753,7 @@ swift中try有以下三种方式: ...@@ -753,7 +753,7 @@ swift中try有以下三种方式:
3. 使用try! 强行try,如果不能反序列化成功,会造成应用闪退, 如果能序列化成功,就返回成功的值,注意该值是个可选值。 3. 使用try! 强行try,如果不能反序列化成功,会造成应用闪退, 如果能序列化成功,就返回成功的值,注意该值是个可选值。
```swift ```swift
// swift // swift
// 注意:dict是个可选值 // 注意:dict是个可选值
let dict = try! JSONSerialization.jsonObject(with: data, options: []) let dict = try! JSONSerialization.jsonObject(with: data, options: [])
...@@ -798,10 +798,10 @@ UTSiOS.try(JSONSerialization.jsonObject(with = data, options = []), "!" ) ...@@ -798,10 +798,10 @@ UTSiOS.try(JSONSerialization.jsonObject(with = data, options = []), "!" )
```ts ```ts
// ts 中 private 修饰符不可出现在模块或命名空间元素上, 如果想将一个类 private,需要使用 @UTSiOS.keyword("private") // ts 中 private 修饰符不可出现在模块或命名空间元素上, 如果想将一个类 private,需要使用 @UTSiOS.keyword("private")
@UTSiOS.keyword("private") @UTSiOS.keyword("private")
class TestA { class TestA {
// 如果需要使用 weak 修饰属性,来避免循环引用,需要使用 @UTSiOS.keyword("weak") // 如果需要使用 weak 修饰属性,来避免循环引用,需要使用 @UTSiOS.keyword("weak")
@UTSiOS.keyword("weak") @UTSiOS.keyword("weak")
private delegate: TestProtocol | null = null private delegate: TestProtocol | null = null
} }
...@@ -809,11 +809,11 @@ class TestA { ...@@ -809,11 +809,11 @@ class TestA {
```ts ```ts
@UTSiOS.keyword("fileprivate") @UTSiOS.keyword("fileprivate")
class TestB { class TestB {
// 一个属性可以同时有多个修饰符,前提是所写的修饰符符合Swift语法 // 一个属性可以同时有多个修饰符,前提是所写的修饰符符合Swift语法
@UTSiOS.keyword("weak") @UTSiOS.keyword("weak")
@UTSiOS.keyword("fileprivate") @UTSiOS.keyword("fileprivate")
delegate: TestProtocol | null = null delegate: TestProtocol | null = null
} }
...@@ -873,4 +873,4 @@ HBuilderX 目前写iOS uts 插件时部分语法提示会有缺失、参数类 ...@@ -873,4 +873,4 @@ HBuilderX 目前写iOS uts 插件时部分语法提示会有缺失、参数类
> 特别注意 > 特别注意
> 如果在使用真机运行编译uts插件时报 swift 版本不兼容的错误,请先检查自己的 XCode 版本,确保安装XCode 版本应大于或者等于打包机的 XCode版本; > 如果在使用真机运行编译uts插件时报 swift 版本不兼容的错误,请先检查自己的 XCode 版本,确保安装XCode 版本应大于或者等于打包机的 XCode版本;
> 如果在使用真机运行编译uts插件时报 XCode 版本应大于 13.2.1的错误,这是说明本地安装的 XCode版本过低,请忽略 13.2.1这个版本限制,直接将本地 XCode升级到大于或者等于打包机的版本,后续我们会优化提示。 > 如果在使用真机运行编译uts插件时报 XCode 版本应大于 13.2.1的错误,这是说明本地安装的 XCode版本过低,请忽略 13.2.1这个版本限制,直接将本地 XCode升级到大于或者等于打包机的版本,后续我们会优化提示。
\ No newline at end of file
...@@ -179,7 +179,7 @@ const status = age >= 18 ? "adult" : "minor"; ...@@ -179,7 +179,7 @@ const status = age >= 18 ? "adult" : "minor";
- `>>=` - `>>=`
* 右移赋值运算符 (>>=) 将变量向右移动指定数量的位,并将结果赋值给变量。 * 右移赋值运算符 (>>=) 将变量向右移动指定数量的位,并将结果赋值给变量。
- `===` - `===`
* 当两边操作数指向同一个对象时,引用相等 (===) 运算符返回true。不同平台有差距,[见下](#completeComparison) * 当两边操作数指向同一个对象时,引用相等 (===) 运算符返回true。不同平台有差距,[见下](#completeComparison)
- `!==` - `!==`
* 当两边操作数不指向同一个对象时,引用不等 (!==) 运算符返回true。 * 当两边操作数不指向同一个对象时,引用不等 (!==) 运算符返回true。
- `-` - `-`
...@@ -561,7 +561,7 @@ b instanceof Int //true ...@@ -561,7 +561,7 @@ b instanceof Int //true
> 3.93+ (Android) > 3.93+ (Android)
await 操作符用于等待一个 [Promise](./buildin-object-api/promise.md) 兑现并获取它兑现之后的值。它只能在[异步函数](./function.md#async)中使用。 await 操作符用于等待一个 [Promise](./buildin-object-api/promise.md) 兑现并获取它兑现之后的值。它只能在[异步函数](./function.md#async)中使用。
在 HBuilderX 3.93 以下的版本或者编译为swift时,await 不能与 [Promise](./buildin-object-api/promise.md) 一同使用,此时请分别参考:[安卓 异步函数](https://uniapp.dcloud.net.cn/plugin/uts-for-android.html#_6-11-synchronized-lock-等线程同步概念-在uts里怎么写)[iOS 异步函数](https://uniapp.dcloud.net.cn/plugin/uts-for-ios.html#_5-1-13-异步方法) 在 HBuilderX 3.93 以下的版本或者编译为swift时,await 不能与 [Promise](./buildin-object-api/promise.md) 一同使用,此时请分别参考:[安卓 异步函数](../plugin/uts-for-android.md#thread-environment)[iOS 异步函数](../plugin/uts-for-ios.md#async-method)
```ts ```ts
async function test(): Promise<string> { async function test(): Promise<string> {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册