从Swift字符串转换为const char *

我正在尝试将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" 

但是当我像这样传递时,dit不起作用

 internal var ipAddress:String = "192.168.1.43" 

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

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

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

谢谢。

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

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

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

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

  • String类型,如果Type为Int8或UInt8。 该字符串将在缓冲区中自动转换为UTF8,并将指向该缓冲区的指针传递给该函数。

不知道为什么,但这段代码是有效的。 这将字符串传递给C函数,期望const char *看起来与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(newString) node = artnet_new(key2Pointer, Int32(verbose)) // VERBOSE : true(1) , false(0) ... 

Swift 3的简单方法

 var ipAddress: String = "192.168.1.43" var verbose: Int = 1 artnet_node artnet_new((ipAddress as NSString).utf8String, verbose) 

您没有指定Swift数组包含的内容。 无论如何,您需要将Swift数组转换为Int8数组:

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