我搜了Swift的书,找不到@同步的Swift版本,请问在Swift中如何进行互斥?
我喜欢并使用这里的许多答案,所以我会选择最适合您的答案。也就是说,当我需要像客观c这样的东西时,我更喜欢的方法@synchronized
使用 swift 2 中引入的 defer
语句。
{
objc_sync_enter(lock)
defer { objc_sync_exit(lock) }
//
// code of critical section goes here
//
} // <-- lock released when this block is exited
这种方法的好处在于,您的临界区可以以任何期望的方式退出包含块(例如,< code>return 、< code>break 、< code>continue 、< code>throw),并且“无论程序控制如何转移,defer语句中的语句都会被执行。”一
我自己一直在寻找这个,并得出结论,Swift内部还没有原生结构。
我确实根据Matt Bridges和其他人的一些代码编写了这个小助手函数。
func synced(_ lock: Any, closure: () -> ()) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
用法非常简单
synced(self) {
println("This is a synchronized closure")
}
我发现了一个问题。在这一点上,作为lock参数传入数组似乎会导致非常迟钝的编译器错误。否则,尽管它似乎按预期工作。
Bitcast requires both operands to be pointer or neither
%26 = bitcast i64 %25 to %objc_object*, !dbg !378
LLVM ERROR: Broken function found, compilation aborted!
您可以使用 GCD。它比@synchronized
更冗长,但可以作为替代品:
let serialQueue = DispatchQueue(label: "com.test.mySerialQueue")
serialQueue.sync {
// code
}
问题内容: 我已经搜索过Swift书,但是找不到@synchronized的Swift版本。如何在Swift中进行互斥? 问题答案: 您可以使用GCD。它比更加冗长,但可以代替:
问题内容: 我想知道它们是否在JAVA的方法“ BeanUtils.CopyProperties(bean1,Bean2);”的目标C中具有等效项。? 或其他解决方案,我想将motherObject强制转换为childObject: 在第一个测试中,它可以正常工作,但是我有一个警告:“不兼容的指针类型返回…”; 我使用WSDL2Objc并生成Bean,并且其名称可以在2代之间更改:-/ 我更喜欢与
问题内容: 我目前正在一个主要是Objective-C的项目中编写一些Swift代码。在我们的ObjC代码中,我们有一个声明为的标头。然后,我们可以声明一个@property,它只能是实现的子类。 (注意:并且不是我定义的;它们是GPUImage库的一部分) 即使标头是在导入的标头中#import的,我们的Swift代码似乎也无法识别这一点。我试图在Swift中复制声明,但是这些都不是正确的语法:
问题内容: 我已经用谷歌搜索,但无法找出什么是等效的。 这是我唯一能找到的(Swift的替代方法responsesToSelector:),但在我的情况下并没有太大意义,因为它检查了委托的存在,我没有委托,我只想检查是否存在新的API在设备上运行时是否返回,如果不是,则返回原先的api版本。 问题答案: 如前所述,在 大多数情况下,您可以使用可选的unwrapper运算符来实现所需的功能。这样,当
问题内容: 下面的Objective-C代码等效于Swift代码。我找不到带有运行时概念的快速主题。 试图获取类的对象? 更新: 尝试以下代码,出现错误 问题答案: 首先,在不知道您在Objective-C中使用该类对象的目的的情况下,很难将该代码转换为Swift。 在Objective-C中,类对象是对象,并且类型可以保存指向任何类对象的指针。但是,当将Objective-C API桥接到Swi
在Swift中,转义闭包参数用注释。Objective-C中是否有任何等效项,以便生成的Swift接口将标记为?