我有一系列不同的结构,所有实现Equatable协议,并试图将其传递给期望集合的函数where T.Iterator.Element: Equatable.我知道如何通过使用类来解决这个问题,只需创建一个class Vehicle: Identifiable, Equatable,然后制作Car和Tractor实现Vehicle.但是,我想知道使用结构和协议是否可行?
这是我正在尝试做的一个人为的例子
//: Playground - noun: a place where people can play
protocol Identifiable {
var ID: String { get set }
init(ID: String)
init()
}
extension Identifiable {
init(ID: String) {
self.init()
self.ID = ID
}
}
typealias Vehicle = Identifiable & Equatable
struct Car: Vehicle {
var ID: String
init() {
ID = ""
}
public static func ==(lhs: Car, rhs: …Run Code Online (Sandbox Code Playgroud) 我正在将屏幕从iPhone设备记录到Mac。作为预览层,我直接从中收集样本缓冲区AVCaptureVideoDataOutput,从中创建纹理并使用渲染它们Metal。我遇到的问题是,在macOS中工作的代码10.13在更新到后就停止工作了10.13。即
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_currentSampleBuffer);
if (!imageBuffer) return;
CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVMetalTextureRef metalTexture = NULL;
CVReturn result = CVMetalTextureCacheCreateTextureFromImage(nil,
self.textureCache,
imageBuffer,
nil,
self.pixelFormat,
width,
height,
0,
&metalTexture);
if (result == kCVReturnSuccess) {
self.texture = CVMetalTextureGetTexture(metalTexture);
}
Run Code Online (Sandbox Code Playgroud)
返回值result = -6660(可以转换为通用值)kCVReturnError,可以在官方的Apple文档中看到,以及metalTexture = NULL。
我使用的是像素格式MTLPixelFormatBGRG422,因为来自相机的样本是2vuy。
作为metalTexture从创建的替代方法sampleBuffer,我现在正在创建一个中间件,NSImage如下所示:
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_currentSampleBuffer);
NSCIImageRep …Run Code Online (Sandbox Code Playgroud)