Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Objective-C代码翻译成Swift_Swift - Fatal编程技术网

将Objective-C代码翻译成Swift

将Objective-C代码翻译成Swift,swift,Swift,我是Swift新手,希望有人能告诉我如何将以下用Objective-C编写的代码片段翻译成Swift 代码: idmapVu=mmcache->kvmap; 对应的标题: @interface MemCache:NSObject{ JavaUtilConcurrentConcurrentLinkedQueue*kvqueue; } 稍后会有一点困惑:您无法以常规/正确的方式从Swift中访问Objective-C类的实例变量。请查看以了解如何解决此问题 下面前面的答案主要关注协议,而不是实例变

我是Swift新手,希望有人能告诉我如何将以下用Objective-C编写的代码片段翻译成Swift

代码:

idmapVu=mmcache->kvmap;
对应的标题:

@interface MemCache:NSObject{
JavaUtilConcurrentConcurrentLinkedQueue*kvqueue;
}

稍后会有一点困惑:您无法以常规/正确的方式从Swift中访问Objective-C类的实例变量。请查看以了解如何解决此问题

下面前面的答案主要关注协议,而不是实例变量

在swift中,您可以将协议作为类型:

让mapVu:javautilconcurrentccurrentccurrentConcurrentNavigablemap=mmcache.kvmap_
请参见一个工作示例:

协议JavautilBlaBla{
}
类别1:JavautilBlaBla{
重写init(){
}
}
二级{
var kvmap_U1:Class1
重写init(){
kvmap_uU8;=Class1()
}
}
让mmcache=Class2()
让mapVu:JavautilBlaBla=mmcache.kvmap_

当前访问实例变量的唯一方法是使用
valueForKey()

所以


谢谢你的回答,但我还没说完。。当我编写您的解决方案时,我得到一个错误:mmcache不包含kvmap_uu变量,因此,当我验证相对于对象mmcache类型的头文件时,我发现kvmap_uuu存在。我不知道为什么不使用Meth。头文件在目标c上,我在同一个应用程序中同时使用语言目标c和swift,我使用桥接头文件导入头文件。这是标题的内容:,请看我更新的问题them@Sam我怀疑你能在objective-C中做到这一点,因为变量是受保护的。我已经在objective-C中写了它,它工作得很好,而现在我需要它在swift上。。。即使kvmap_uu也是公共的,它也不是private@Sam您的代码是用
OrgKalimaCacheServerMemCache
的子类编写的吗?这是一个非常奇怪的Objective-C;它看起来很旧。它是从哪里来的?您可以更改它吗?我不能更改它,因为有太多的类如果我更改一个,我必须更改使用更改的类的所有类。这将是正常的,这将是
kvmap
的一个getter-Swift可以调用一些东西来获取映射,而不是直接读取实例变量的当前方法。可以为所有现有代码保留实例变量。按照现代标准,一个实例变量是这样公开的,这是非常非常奇怪的,但是你不需要为了提供一个getter而停止这样做;是否可以编写一个可以返回它的get函数?它是对一个类的引用,该类将自己表示为实现了一个协议。getter看起来像
-(id)kvmap或例如
@属性(非原子,只读)id kvmap如果要使用属性语法。如果需要,您也可以传递对协议的引用-它们与元类一样存在于运行时中-但很少这样做。是的,这是可行的,但在发布此解决方案之前,我已经编写了一个get函数,这也是可行的。。。你的解决方案我在另一个案例中尝试过,我发现它也很有效…谢谢
let mapVu = mmcache.valueForKey("kvmap_") as! JavaUtilConcurrentConcurrentNavigableMap!