6

我正在尝试将 const char * 传递给从 Swift 中的 Swift 字符串转换而来的旧 C 库。

这是我正在调用的 C 函数:

artnet_node artnet_new(const char *ip, int verbose) { ...

如何将 Swift 字符串转换为此 const char 类型?当我像这样传递 ipAddress 时它可以工作:

internal var ipAddress = "192.168.1.43"

但是当我像这样通过它时,它不起作用

internal var ipAddress:String = "192.168.1.43"

我需要在需要指定类型的函数中使用它:

internal func setupArtnode(ip:String) -> Int{

我尝试使用 AnyObject 而不是 String 但这也不起作用。

谢谢。

4

4 回答 4

8

您应该能够将 aString直接传递给期望的 C 函数const char *,它将自动转换为以 null 结尾的 UTF-8 字符串:

let string = "string"
let node = artnet_new(string, 1)

有关更多信息,请参阅与 C API 交互。以下是相关摘录:

当函数被声明为采用 UnsafePointer 参数时,它可以接受以下任何一种:

  • 如果 Type 为 Int8 或 UInt8,则为 String 值。该字符串将在缓冲区中自动转换为 UTF8,并将指向该缓冲区的指针传递给函数。
于 2016-12-23T22:42:36.783 回答
3

不知道为什么,但这段代码正在工作。这会将一个字符串传递给一个需要 const char* 的 C 函数,这似乎与 unsafePointer 相同。

internal func setupArtnode(ipAddress:String) -> NSInteger{
    let cString = self.ipAddress.cString(using: String.defaultCStringEncoding)!
    let newString:String = NSString(bytes: cString, length: Int(ipAddress.characters.count), encoding:String.Encoding.ascii.rawValue)! as String
    let key2Pointer = UnsafePointer<Int8>(newString)

    node = artnet_new(key2Pointer, Int32(verbose))     // VERBOSE : true(1) , false(0)
...
于 2016-12-28T11:16:49.773 回答
2

Swift 3 的简单方法

var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)
于 2018-04-20T08:59:44.760 回答
0

您没有指定 Swift 数组包含的内容。在任何情况下,您都需要将 Swift 数组转换为以下数组Int8

let str = "Hello world"
let cArray = str.cString(using: .utf8)

artnet_new(cArray, 1)
于 2016-12-23T22:23:39.377 回答