我将一些Obj-C代码转换为Swift并遇到了问题。这是ObjC代码:
- (void)collisionBehavior:(UICollisionBehavior *)behavior
beganContactForItem:(id<UIDynamicItem>)item
withBoundaryIdentifier:(id<NSCopying>)identifier
atPoint:(CGPoint)p {
NSLog(@"Boundary contact occurred - %@", identifier);
}
这是从UICollisionBehaviorDelegate
实现协议方法,这里是Swift:
func collisionBehavior(behavior: UICollisionBehavior,
beganContactForItem item: UIDynamicItem,
withBoundaryIdentifier identifier: NSCopying,
atPoint p: CGPoint) {
println("Boundary contact occurred - \(identifier)")
}
如果没有标识符的对象发生冲突,则上述内容将失败EXC_BAD_ACCESS
。在这种情况下,identifier
的值为0x0
,即它为零。
但是,我不能按如下方式执行零检查:
if identifier != nil {
println("Boundary contact occurred - \(boundaryName)")
}
因为!=
未定义NSCopying
运算符。有谁知道我如何检查nil,或者是否有一个字符串&#39;操作我可以执行当遇到零值时不会失败吗?
答案 0 :(得分:8)
我假设您可以使用相同的解决方法 Xcode 6.1 Release Notes表示返回值被错误地视为不可为空的方法,属性或初始值设定项:
let identOpt : NSCopying? = identifier
if let ident = identOpt {
}
更好的是,您可以实际更改方法签名,将NSCopying
替换为NSCopying?
:
func collisionBehavior(behavior: UICollisionBehavior,
beganContactForItem item: UIDynamicItem,
withBoundaryIdentifier identifier: NSCopying?,
atPoint p: CGPoint) {
if let unwrapedIdentifier = identifier {
println("Boundary contact occurred - \(unwrapedIdentifier)")
} else {
println("Boundary contact occurred - (unidentified)")
}
}