Xcode 8.1 Swift 3 错误:无法将“String”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”

Posted

技术标签:

【中文标题】Xcode 8.1 Swift 3 错误:无法将“String”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”【英文标题】:Xcode 8.1 Swift 3 Error: cannot convert value of type 'String' to expected argument type 'UnsafeMutableRawPointer' 【发布时间】:2016-10-29 07:53:54 【问题描述】:

包含 var sceneData 代码的行给出了错误,显然是因为“路径”字符串。有谁知道如何解决这个问题?谢谢!

extension SKNode 
    class func unarchiveFromFile(_ file : String) -> SKNode? 
        if let path = Bundle.main.path(forResource: file, ofType: "sks") 
            var sceneData = Data(bytesNoCopy: path, count: .DataReadingMappedIfSafe, deallocator: nil)!
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

            archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
            let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
            archiver.finishDecoding()
            return scene
         else 
            return nil
        
    

【问题讨论】:

【参考方案1】:

Data(bytesNoCopy: 需要一个指针而不是字符串路径。

从磁盘读取Data 的API 是Data(contentsOf,但是它需要一个URL

extension SKNode 
  class func unarchiveFromFile(_ file : String) -> SKNode? 
    if let url = Bundle.main.url(forResource: file, withExtension: "sks") 
      do 
        var sceneData = try Data(contentsOf: url)
        var archiver = NSKeyedUnarchiver(forReadingWith: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
        archiver.finishDecoding()
        return scene
       catch 
        return nil
      
     else 
      return nil
    
  

在 Swift 3 中,我将方法重命名为

class func unarchive(from file : String) -> SKNode?  ...

【讨论】:

在 Swift 4 中,decodeObjectForKey 定义已更改为:let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as!游戏场景

以上是关于Xcode 8.1 Swift 3 错误:无法将“String”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”的主要内容,如果未能解决你的问题,请参考以下文章

我编译 Swift 2.3 项目并在 Xcode 8.1 上有这个问题

导航不出现 Xcode 8.1 iOS 10 Swift 3

当我打开 .swift/.xib 文件时,XCode 8.1 崩溃

如何使约束适用于横向和纵向(xcode 8.1 / swift3 / storyboard)

Swift 开发的代码在 Xcode 8.x 或 Xcode 7.x 中不起作用

XCode 8.1 (8B62) - 无法在 iPad Retina (ipad 4) 上构建应用程序