在 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 classisDirexists,或者至少使用 Pair。 return 它们来自函数 fileExistsAtPath