Converting from Swift string to const char*

前端 未结 4 434
渐次进展
渐次进展 2020-12-03 22:54

I\'m trying to pass a const char * to an old C library converted from a Swift string in Swift.

This is the C function I\'m calling:

artnet_node artne         


        
相关标签:
4条回答
  • 2020-12-03 23:39

    Not sure why but this code is working. This passes a string to a C function expecting a const char* which seems to be the same as a 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 讨论(0)
  • 2020-12-03 23:42

    Simple way for Swift 3

    var ipAddress: String = "192.168.1.43"
    var verbose: Int = 1
    artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)
    
    0 讨论(0)
  • 2020-12-03 23:46

    You should be able to pass a String directly to a C function expecting const char * and it will be automatically converted to a null-terminated UTF-8 string:

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

    See Interacting with C APIs for more information. Here is the relevant excerpt:

    When a function is declared as taking an UnsafePointer argument, it can accept any of the following:

    • A String value, if Type is Int8 or UInt8. The string will automatically be converted to UTF8 in a buffer, and a pointer to that buffer is passed to the function.
    0 讨论(0)
  • 2020-12-03 23:46

    You didn't specify what your Swift array contains. In any case, you need to convert your Swift array to an array of Int8:

    let str = "Hello world"
    let cArray = str.cString(using: .utf8)
    
    artnet_new(cArray, 1)
    
    0 讨论(0)
提交回复
热议问题