这个系统对象指针代码在Swift中是否完全可以?

时间:2015-05-06 02:30:58

标签: objective-c cocoa swift

我被指向了这个objc片段from WWDC 14,但我正在研究一个Swift项目。

CMIOObjectPropertyAddress   prop    = {
    kCMIOHardwarePropertyAllowScreenCaptureDevices,
    kCMIOObjectPropertyScopeGlobal,
    kCMIOObjectPropertyElementMaster
};
UInt32                      allow   = 1;

CMIOObjectSetPropertyData(kCMIOObjectSystemObject, &prop, 0, NULL, sizeof(allow), &allow);

然后我尝试重写Swift:

var prop : CMIOObjectPropertyAddress {
    kCMIOHardwarePropertyAllowScreenCaptureDevices
    kCMIOObjectPropertyScopeGlobal
    kCMIOObjectPropertyElementMaster
}

var allow:UInt32 = 1
CMIOObjectSetPropertyData(kCMIOObjectSystemObject, &prop, 0, nil, sizeof(UInt32), &allow)

但它甚至没有验证。我不知道如何翻译CMIOObjectPropertyAddress结构。 Xcode说

  

/Users/mortenjust/Dropbox/hack/learning/screenrec/screenrec/deleteme.swift:32:61:   无法分配到只获取属性' prop'

2 个答案:

答案 0 :(得分:3)

C struct转换为Swift结构。使用隐式成员初始值设定项:

    var prop = CMIOObjectPropertyAddress(
        mSelector: UInt32(kCMIOHardwarePropertyAllowScreenCaptureDevices),
        mScope: UInt32(kCMIOObjectPropertyScopeGlobal),
        mElement: UInt32(kCMIOObjectPropertyElementMaster))

很酷的部分是当您输入CMIOObjectPropertyAddress(时,代码完成会为您提供其余部分。

答案 1 :(得分:3)

你是对的,只是让它在第二步运行。结果我也必须纠正一些类型。这是完整的翻译:

        var prop = CMIOObjectPropertyAddress(
        mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyAllowScreenCaptureDevices),
        mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal),
        mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMaster))

    var allow : UInt32 = 1
    var dataSize : UInt32 = 4
    var zero : UInt32 = 0
    CMIOObjectSetPropertyData(CMIOObjectID(kCMIOObjectSystemObject), &prop, zero, nil, dataSize, &allow)

    var session = AVCaptureSession()
    session.sessionPreset = AVCaptureSessionPresetHigh

    var devices = AVCaptureDevice.devices()
    for device in AVCaptureDevice.devices() {
        println(device)
    }