gpt4 book ai didi

Swift - 不检查 NSCopying 函数参数

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:46 25 4
gpt4 key购买 nike

我正在将一些 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 实现一个协议(protocol)方法,这里是 Swift:

func collisionBehavior(behavior: UICollisionBehavior,
beganContactForItem item: UIDynamicItem,
withBoundaryIdentifier identifier: NSCopying,
atPoint p: CGPoint) {

println("Boundary contact occurred - \(identifier)")
}

如果没有标识符的对象发生碰撞,上述操作将失败并返回 EXC_BAD_ACCESS。在这种情况下,identifier 的值为 0x0,即它为 nil。

但是,我无法执行如下的 nil 检查:

if identifier != nil {
println("Boundary contact occurred - \(boundaryName)")
}

因为 != 运算符没有为 NSCopying 定义。有谁知道我如何检查 nil,或者是否有我可以执行的“to string”操作,当它遇到 nil 值时不会失败?

最佳答案

我假设您可以使用在 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)")
}
}

关于Swift - 不检查 NSCopying 函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26995918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com