Swift - nil检查NSCopying函数参数

时间:2014-11-18 13:48:28

标签: swift

我将一些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;操作我可以执行当遇到零值时不会失败吗?

1 个答案:

答案 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)")
  }
}