2016-12-23 227 views
3

我試圖將一個const char *傳遞給一個從Swift中的Swift字符串轉換而來的舊C庫。從Swift字符串轉換爲const char *

這是C函數我打電話:

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

我怎麼能迅捷的字符串轉換爲這種爲const char類型?它的工作原理,當我通過ip地址是這樣的:

internal var ipAddress = "192.168.1.43" 

但是當我將它傳遞這樣

internal var ipAddress:String = "192.168.1.43" 

我需要這一個功能,我需要指定類型DIT不起作用:

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

我嘗試使用AnyObject而不是字符串,但不工作的。

謝謝。

+0

請添加關於什麼不工作的澄清 - 編譯或執行,以及任何相關的錯誤消息。 – sbooth

回答

2

不確定爲什麼只是這段代碼正在工作。這將字符串傳遞給一個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<Int8>(newString) 

    node = artnet_new(key2Pointer, Int32(verbose))  // VERBOSE : true(1) , false(0) 
... 
0

你沒有指定你的Swift數組包含什麼。在任何情況下,你需要你的斯威夫特數組轉換到Int8數組:

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

artnet_new(cArray, 1) 
+0

對不起,我打錯了,我試圖改變一個字符串爲一個常量字符:s,編輯 –

3

您應該能夠直接傳遞String C函數期待const char *,它會自動轉換爲一個空結束UTF-8字符串:

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

查看Interacting with C APIs瞭解更多信息。下面是相關的摘錄:

當一個函數被聲明爲接受的UnsafePointer說法, 它可以接受任何以下的:

  • 的字符串值,如果類型是INT8或UINT8。該字符串將自動轉換爲緩衝區中的UTF8,並將指向該緩衝區的指針傳遞給該函數。
+0

由於某種原因該函數將不接受參數,並採用默認值的問題,我更新了一些更多的問題信息 –

+0

你的報價讓我使用UnsafePointer 似乎工作,我添加了我的工作代碼。謝謝!! –