Металл iOS дает ошибку компиляции

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, я получаю сообщение об ошибке "Использование необъявленного типа CAMetalLayer", хотя я импортировал Metal и QuartzCore. Как я могу заставить этот код работать?

Ответ 2

Если ваше приложение имеет запасной вариант или режим, который не зависит от 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

Тогда ваш код, по крайней мере, скомпилируется как для устройства, так и для симулятора, что может упростить вашу разработку без использования Metal.

Ответ 3

Та же проблема может возникнуть, если вы назовете свой проект XCode "Металл".

В этом случае компилятор будет сбит с толку, и вы получите то же сообщение об ошибке.