精灵包 |斯威夫特 3 | - 无法将 Void 类型的值(aka'()' 转换为预期的参数类型 'unsafeRawPointer'

Posted

技术标签:

【中文标题】精灵包 |斯威夫特 3 | - 无法将 Void 类型的值(aka\'()\' 转换为预期的参数类型 \'unsafeRawPointer\'【英文标题】:Spritekit | SWIFT 3 | - Cannot convert value of type Void (aka'()' to expected argument type 'unsafeRawPointer'精灵包 |斯威夫特 3 | - 无法将 Void 类型的值(aka'()' 转换为预期的参数类型 'unsafeRawPointer' 【发布时间】:2016-09-22 09:47:28 【问题描述】:

无法将 Void 类型的值(aka'()' 转换为预期的参数类型 '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
        
    

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

【问题讨论】:

【参考方案1】:

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

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

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 版本实际上可以工作,我上面的代码应该可以工作。

【讨论】:

太棒了。很有魅力。谢谢你

以上是关于精灵包 |斯威夫特 3 | - 无法将 Void 类型的值(aka'()' 转换为预期的参数类型 'unsafeRawPointer'的主要内容,如果未能解决你的问题,请参考以下文章

如何控制多个同名精灵套件节点?

无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0

如何修复:无法将“CLLocationDegrees”(又名“Double”)类型的值分配给“Float!”在斯威夫特 3

无法调用非函数类型“((AnyObject)-> AnyObject?)!”的值- 斯威夫特 3

无法在 Alamofire response.result.value 中使用 NSURL!斯威夫特,xcode 7.3

斯威夫特:分数增加两次,因为碰撞被检测到两次?