web-dev-qa-db-ja.com

MetaliOSでコンパイルエラーが発生する

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の使用」というエラーが表示されます。このコードを機能させるにはどうすればよいですか?

17
Pocketkid2

[〜#〜]更新[〜#〜]
今年はシミュレーターのサポートが予定されています (2019)

Pre Xcode 11/iOS 13
金属コードはシミュレーターでコンパイルされません。デバイス用にコンパイルしてみてください。

57

アプリに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

そうすれば、コードは少なくともデバイスとシミュレーターの両方でコンパイルされるため、非金属の開発が容易になります。

1
nevyn

XCodeプロジェクトに「Metal」という名前を付けた場合にも同じ問題が発生する可能性があります。

その場合、コンパイラは混乱し、同じエラーメッセージが表示されます。

0
fewlinesofcode