import UIKit
import Metal
import QuartzCore
class ViewController: UIViewController {
var device: MTLDevice! = nil
var metalLayer: CAMetalLayer! = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
device = MTLCreateSystemDefaultDevice()
metalLayer = CAMetalLayer() // 1
metalLayer.device = device // 2
metalLayer.pixelFormat = .BGRA8Unorm // 3
metalLayer.framebufferOnly = true // 4
metalLayer.frame = view.layer.frame // 5
view.layer.addSublayer(metalLayer) // 6
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
これをViewController.Swiftに含めると、MetalとQuartzCoreをインポートしたにもかかわらず、「宣言されていないタイプCAMetalLayer
の使用」というエラーが表示されます。このコードを機能させるにはどうすればよいですか?
[〜#〜]更新[〜#〜]:
今年はシミュレーターのサポートが予定されています (2019)
Pre Xcode 11/iOS 13:
金属コードはシミュレーターでコンパイルされません。デバイス用にコンパイルしてみてください。
アプリにMetalに依存しないフォールバックまたはモードがあり、シミュレーター用にアプリをコンパイルする場合は、次のようにすることができます。
#if targetEnvironment(simulator)
// dummy, do-nothing view controller for simulator
class ViewController: UIViewController {
}
#else
class ViewController: UIViewController {
var device: MTLDevice! = nil
var metalLayer: CAMetalLayer! = nil
override func viewDidLoad() {
super.viewDidLoad()
device = MTLCreateSystemDefaultDevice()
metalLayer = CAMetalLayer()
...
}
}
#endif
そうすれば、コードは少なくともデバイスとシミュレーターの両方でコンパイルされるため、非金属の開発が容易になります。
XCodeプロジェクトに「Metal」という名前を付けた場合にも同じ問題が発生する可能性があります。
その場合、コンパイラは混乱し、同じエラーメッセージが表示されます。