在 Kotlin 中传递值作为参考
Pass value as reference in Kotlin
我想将代码 Objective C 转换为 Kotlin 多平台
这是Objective C代码
{
NSFileManager *fileManager = [[NSFileManager alloc] init];
BOOL isDir;
BOOL exists = [fileManager fileExistsAtPath:path isDirectory:&isDir];
BOOL success = false;
if (isDir && exists) {
NSURL *pathUrl = [NSURL fileURLWithPath:path];
NSError *error = nil;
success = [pathUrl setResourceValue:isExcluded
forKey:NSURLIsExcludedFromBackupKey
error:&error];
if (!success) {
NSLog(@"Could not exclude AsyncStorage dir from backup %@", error);
}
}
return success;
}
在上面的代码变量 isDir
传递给函数时使用 & fileExistsAtPath
那么我如何在 Kotlin 中使用 isDir
呢?我知道这是
address-of unary operator
我可以使用
val isDir: CPointer<BooleanVar /* = kotlinx.cinterop.BooleanVarOf<kotlin.Boolean> */>? = null
val exists = fileManager?.fileExistsAtPath(path, isDir)
要在 Kotlin 中创建指针,您需要 memScoped
,在此范围内您可以调用 alloc
来创建任何类型的指针。
以下是使用 Kotlin 编写代码的方法:
return memScoped {
val fileManager = NSFileManager.defaultManager
val isDir = alloc<BooleanVar>()
val exists = fileManager.fileExistsAtPath(path, isDirectory = isDir.ptr)
var success = false
if (exists && isDir.value) {
val pathUrl = NSURL.fileURLWithPath(path)
val error = alloc<ObjCObjectVar<NSError?>>()
success = pathUrl.setResourceValue(isExcluded, forKey = NSURLIsExcludedFromBackupKey, error = error.ptr)
if (!success) {
println("Could not exclude AsyncStorage dir from backup ${error.value}")
}
}
return@memScoped success
}
您可以传递 lambda 并更改其中的 bool 值
var isDir: Boolean = false
fileExistsAtPath(onChange = { newValue -> isDir = newValue })
但我认为这不是一个好方法。尝试使用 2 个字段创建 data class
:isDir
和 exists
,或者至少使用 Pair
。 return 它们来自函数 fileExistsAtPath
我想将代码 Objective C 转换为 Kotlin 多平台 这是Objective C代码
{
NSFileManager *fileManager = [[NSFileManager alloc] init];
BOOL isDir;
BOOL exists = [fileManager fileExistsAtPath:path isDirectory:&isDir];
BOOL success = false;
if (isDir && exists) {
NSURL *pathUrl = [NSURL fileURLWithPath:path];
NSError *error = nil;
success = [pathUrl setResourceValue:isExcluded
forKey:NSURLIsExcludedFromBackupKey
error:&error];
if (!success) {
NSLog(@"Could not exclude AsyncStorage dir from backup %@", error);
}
}
return success;
}
在上面的代码变量 isDir
传递给函数时使用 & fileExistsAtPath
那么我如何在 Kotlin 中使用 isDir
呢?我知道这是
address-of unary operator
我可以使用
val isDir: CPointer<BooleanVar /* = kotlinx.cinterop.BooleanVarOf<kotlin.Boolean> */>? = null
val exists = fileManager?.fileExistsAtPath(path, isDir)
要在 Kotlin 中创建指针,您需要 memScoped
,在此范围内您可以调用 alloc
来创建任何类型的指针。
以下是使用 Kotlin 编写代码的方法:
return memScoped {
val fileManager = NSFileManager.defaultManager
val isDir = alloc<BooleanVar>()
val exists = fileManager.fileExistsAtPath(path, isDirectory = isDir.ptr)
var success = false
if (exists && isDir.value) {
val pathUrl = NSURL.fileURLWithPath(path)
val error = alloc<ObjCObjectVar<NSError?>>()
success = pathUrl.setResourceValue(isExcluded, forKey = NSURLIsExcludedFromBackupKey, error = error.ptr)
if (!success) {
println("Could not exclude AsyncStorage dir from backup ${error.value}")
}
}
return@memScoped success
}
您可以传递 lambda 并更改其中的 bool 值
var isDir: Boolean = false
fileExistsAtPath(onChange = { newValue -> isDir = newValue })
但我认为这不是一个好方法。尝试使用 2 个字段创建 data class
:isDir
和 exists
,或者至少使用 Pair
。 return 它们来自函数 fileExistsAtPath