Ответ 1
ОБНОВЛЕНИЕ:
Поддержка симулятора в этом году (2019)
Pre Xcode 11/iOS 13:
Металлический код не компилируется на симуляторе. Попробуйте скомпилировать для устройства.
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. Как я могу заставить этот код работать?
ОБНОВЛЕНИЕ:
Поддержка симулятора в этом году (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
Тогда ваш код, по крайней мере, скомпилируется как для устройства, так и для симулятора, что может упростить вашу разработку без использования Metal.
Та же проблема может возникнуть, если вы назовете свой проект XCode "Металл".
В этом случае компилятор будет сбит с толку, и вы получите то же сообщение об ошибке.