= new Map()
map.set("name","uts")
```
#### 5.1.12 覆写方法存在参数标签的兼容问题
> HBuilder X 3.6.11+ 版本支持
当覆写系统方法,或实现三方SDK的协议方法时,一些方法可能会存在参数标签的情况
以 hello uts 中腾讯定位为例,监听位置变化时需要实现协议方法:
`tencentLBSLocationManager(_ manager: TencentLBSLocationManager, didUpdate location: TencentLBSLocation)`
此方法第二个参数存在 `didUpdate` 参数标签
原生 swift 中的实现为
```swift
// swift
func tencentLBSLocationManager(_ manager: TencentLBSLocationManager, didUpdate location: TencentLBSLocation) {
var response = LocationResponse();
response.name = location.name;
response.address = location.address;
response.latitude = NSNumber(location.location.coordinate.latitude);
response.longitude = NSNumber(location.location.coordinate.longitude);
self.locationOptions?.success(response);
}
```
uts 中需要用注解语法 @argumentLabel("didUpdate") 来表示参数标签
```ts
// 实现位置更新的 delegate 方法
tencentLBSLocationManager(manager: TencentLBSLocationManager, @argumentLabel("didUpdate") location: TencentLBSLocation) {
let response = new LocationResponse();
response.name = location.name;
response.address = location.address;
response.latitude = Number(location.location.coordinate.latitude);
response.longitude = Number(location.location.coordinate.longitude);
this.locationOptions?.success(response)
}
```
示例文件在 hello uts 中的位置:
`~/uni_modules/uts-tencentgeolocation/utssdk/app-ios/index.uts`
#### 5.1.13 异步方法
swift 标记某个函数或者方法是异步的,你可以在它的声明中的参数列表后边加上 `async` 关键字
```swift
// swift
@available(iOS 13.0.0, *)
func testAsync(_ opts: AsyncOptions) async -> UTSJSONObject {
if (opts.type == "success") {
opts.success("success");
}
else {
opts.fail("fail");
}
opts.complete("complete");
return UTSJSONObject([
"name": "testAsync"
]);
}
```
uts 中定义异步方法是在方法最前面加上 `async` 关键字
```ts
// uts
async function testAsync(opts: AsyncOptions) {
if (opts.type == "success") {
opts.success("success");
} else {
opts.fail("fail");
}
opts.complete("complete");
return { name: "testAsync" };
}
```
**需要注意:使用 async 定义异步方法只有 iOS 13+ 版本才支持,低版本调用会报错**
## 6 常见问题(持续更新)
### 6.1 如何在UTS环境中,获取当前 UIViewController 实例
参考 Hello UTS 项目中的 uts-alert 插件
路径:
> ~/uni_modules/uts-alert/utssdk/app-ios/index.uts
### 6.2 如何在UTS环境中,操作 UI 线程
```
DispatchQueue.main.async(execute=():void => {
// 在主线程中可操作 UI
})
```
参考Hello UTS项目中的 uts-toast 插件
路径:
> ~/uni_modules/uts-toast/utssdk/app-ios/index.uts
## 7 已知待解决问题(持续更新)
### 7.1 语法提示问题
HBuilderX 目前写iOS uts 插件时部分语法提示会有缺失、参数类型不准确的问题,例如:
- 类的构造方法目前只会提示一个,实际上可能会存在多个;
- 缺失可选类型标识;
- 参数标签没有标记无法知道是否需要忽略参数标签;
- 不支持导入包含有子模块的原生模块;
- 暂不支持.a依赖库的代码提示;
这些问题会在后续版本中优化
### 7.2 语法不兼容问题
#### 7.2.1 for 循环语法问题
- for in 循环目前有语法兼容问题
- for (int i = 0, i < array.length, i++) 方法目前有语法兼容问题
### 7.3 类型兼容问题
- 元组类型目前不支持
### 8 .a依赖库相关说明
#### 8.1 .a库存放的目录结构
└─Libs // .a库存放目录
├─MyStaticLibA //A静态库(该库所有文件放在此文件夹内,OC库)
│ ├─libMyStaticLib.a //.a文件,必须
│ ├─MyStaticLib.h //A.a库对应的头文件,必须
│ ├─MyClassA.h //需要暴露的头文件A,可选
│ └─MyClassB.h //需要暴露的头文件B,可选
└─TestSwiftLibrary //B静态库(该库所有文件放在此文件夹内,Swift库)
├─libTestSwiftLibrary.a //.a文件,必须
└─TestSwiftLibrary.swiftmodule //.swiftmodule文件夹,必须
注意:
- 将.a库的所有文件存放在一个文件夹内,多个.a库就创建多个文件夹;
- 未对某个.a库文件夹下的文件做递归查找,请不要将.a或.h文件嵌套在多层文件夹内,以免发生错误;
#### 8.2 .a库的使用说明
- OC语言创建的.a库在使用时无需import,可直接使用;
- Swift语言创建的.a库在使用前需要在uts文件中import;
- HBuilder X目前暂不支持.a库相关代码的语法提示;
#### 8.3 .a库的使用示例
- OC语言创建的.a库使用示例:
```ts
// uts
const aResult = ToolA.toolAMethod();
const bResult = ToolB.toolBMethod();
const libResult = TestLib.testLib();
const res = {
aResult: aResult,
bResult: bResult,
libResult: libResult
};
options.success?.(res);
```
- Swift语言创建的.a库使用示例:
```ts
// uts
import { Tool, Manager, TestLibraryExa } from 'TestLibraryExa';
Manager.testManager();
Tool.testTool()
let lib = TestLibraryExa();
lib.test()
console.log(lib.version);
```
### 9 有关Swift语言创建的Framework和.a的Swift版本兼容性问题
- 由于高版本XCode编译的Swift语言Framework动态库、静态库、.a库在低版本XCode上无法编译通过,因此存在Swift版本兼容性问题;
- 目前打包机使用的XCode版本号是13.2.1,对应的Swift版本是5.5.2;
- 请在编译Swift相关Framework和.a库时选择和打包机相同或者更低版本的XCode;
- 选择比打包机更低版本XCode编译Swift库时请在Target->buildSettings设置Buid Libraries for Distribution 为Yes。