我试图了解IOKit以及它如何让我在一个Swift程序中访问串行端口。
我现在操作的类如下:

import Foundation

import Cocoa

import IOKit.serial.IOSerialKeys



class Serial {

    init() {
    }

    @IBOutlet var serialListPullDown : NSPopUpButton!

    func refreshSerialList(defaultprompt: String) {


        // remove everything from the pull down list
        serialListPullDown?.removeAllItems()

        // ask for all the serial ports
        IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching(kIOSerialBSDServiceValue), io_iterator_t)

    }
}

根据我所读的内容,我认为我已经正确地设置了IOServiceMatchingServices,但是我得到了一些错误,例如“在类型名之后需要成员名或构造函数调用”和“o_iterator_t.type”不能转换为“UnsafeMutualPointer”
这是什么意思?

最佳答案

这里有几个不同的问题——让我们先把你的进口货算清楚。看起来你需要这两个:

import IOKit
import IOKit.serial

对于参数,如果我们将它们定义为局部变量,就更容易看到我们在使用什么,如下所示:
// this one's easy, just grabbing a constant from IOKit.serial
let masterPort: mach_port_t = kIOMasterPortDefault
// here we get back an Unmanaged<CFMutableDictionary> and need to convert it to
// a CFDictionary using takeRetainedValue()
let classesToMatch: CFDictionary = IOServiceMatching(kIOSerialBSDServiceValue).takeRetainedValue()
// the iterator that will contain the results of IOServiceGetMatchingServices
var matchingServices: io_iterator_t = 0

最后,调用方法:
// note that the last parameter is an UnsafeMutablePointer<io_iterator_t>
// so we need to prefix matchingServices with an ampersand (&)
let kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, &matchingServices)
if kernResult == KERN_SUCCESS {
    // success
} else {
    // error
}

这让人感觉很接近斯威夫特现在所能处理的边缘——在继续之前,一定要好好阅读这两页:
Interacting with C APIs(指针部分)
Working with Cocoa Data Types(非托管对象部分)
最后,确保您可以进入IOKit框架的转换后的Swift声明。有很多有用的注释,您将能够看到哪些参数和返回值是非托管的或指针(因为我认为这个框架的官方文档还没有更新)。

关于macos - 使用IOKit搜索串行端口-Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25320213/

10-11 04:28