gpt4 book ai didi

ios - Sprite 套件 | swift 3 | - 无法转换 Void 类型的值(又名“( )' to expected argument type ' unsafeRawPointer”

转载 作者:行者123 更新时间:2023-11-29 00:40:29 24 4
gpt4 key购买 nike

无法将 Void 类型的值(又名“()”)转换为预期的参数类型“unsafeRawPointer”

代码允许我通过触摸在屏幕上画线。我正在使用字典来允许多个用户同时绘制多条线。

就在我试图将指针存储在 NSValue 键中时。

在我开始升级到 Swift 3 之前,这在 Objective C 中运行良好。

var lines: NSMutableDictionary! 

override func didMove(to view: SKView) {
lines = NSMutableDictionary.init(capacity: 4)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let location: CGPoint = t.location(in: self)
// Create a mutable path
let path: UIBezierPath = UIBezierPath()
path.move(to: location)
// Create a shape node using the path
lineNode = SKShapeNode(path: path.cgPath)
lineNode.name = "sprite\(i)"
self.addChild(lineNode)

// Use touch pointer as the dictionary key. Since the dictionary key must conform to
// NSCopying, box the touch pointer in an NSValue
var key = NSValue(pointer: (t as! Void)) -- **ERROR HERE**
lines[key] = lineNode
}
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let location = t.location(in: self)

// Retrieve the shape node that corresponds to touch
let key = NSValue(pointer: (touches as! Void)) -- **ERROR HERE**
lineNode = (lines[key] as! String)

if lineNode != nil {
// Create and initial a mutable path with the lineNode's path
let path = UIBezierPath(cgPath: lineNode.path!)
// Add a line to the current touch point
path.addLine(to: location)
// Update lineNode
lineNode.path = path.cgPath
lineNode.physicsBody = SKPhysicsBody(edgeChainFrom: path.cgPath)
lineNode.name = lineNodeCategoryName
}
}
}

有谁知道我为什么会收到这个错误以及如何解决该错误?

最佳答案

也许您混淆了 (void *)... 在 Objective-C 中的转换和 as! Swift 中的 Void。它们完全不同。

由于 UITouchHashable,您可以将它用作 Swift Dictionary 的键。尝试使用它:

var lines: [UITouch: SKShapeNode] = [:]

override func didMove(to view: SKView) {
lines = Dictionary(minimumCapacity: 4)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let location: CGPoint = t.location(in: self)
// Create a mutable path
let path: UIBezierPath = UIBezierPath()
path.move(to: location)
// Create a shape node using the path
let lineNode = SKShapeNode(path: path.cgPath)
lineNode.name = "sprite\(i)"
self.addChild(lineNode)

lines[t] = lineNode
}
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let location = t.location(in: self)

// Retrieve the shape node that corresponds to touch
if let lineNode = lines[t] {
// Create and initial a mutable path with the lineNode's path
let path = UIBezierPath(cgPath: lineNode.path!)
// Add a line to the current touch point
path.addLine(to: location)
// Update lineNode
lineNode.path = path.cgPath
lineNode.physicsBody = SKPhysicsBody(edgeChainFrom: path.cgPath)
lineNode.name = lineNodeCategoryName
}
}
}

我不知道 UITouch 的这种用法,但正如您所说的使用 NSValue 的 Objective-C 版本确实有效,我上面的代码应该有效。

关于ios - Sprite 套件 | swift 3 | - 无法转换 Void 类型的值(又名“( )' to expected argument type ' unsafeRawPointer”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635685/

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