[swift-users] Ugliness bridging Swift String to char *
    Kenny Leung 
    kenny_leung at pobox.com
       
    Wed Mar  1 16:23:10 CST 2017
    
    
  
Hi All.
Swift automatically bridges String to char * when calling C functions. For instance, strlen gets translated as:
    public func strlen(_ __s: UnsafePointer<Int8>!) -> UInt
I can call it from Swift like this:
    strlen("|")
I’m But, I’m working with a C struct containing a char *:
    public struct _PQprintOpt {
        public var header: pqbool /* print output field headings and row count */
        public var align: pqbool /* fill align the fields */
        public var fieldSep: UnsafeMutablePointer<Int8>! /* field separator */
        ...
    }
    public typealias PQprintOpt = _PQprintOpt
When I try to assign to fieldSep like this:
    opt.fieldSep = "|"
I get the error:
    Cannot assign value of type 'String' to type 'UnsafeMutablePointer<Int8>!'
    
I assume that the difference is that strlen declares const char * and fieldSep is simply char *, so strlen is non-mutable while fieldSep is mutable. Is this correct?
I currently have this ugly hack to get this to work:
    var opt :PQprintOpt = PQprintOpt()
    guard let fieldSeparator = "|".cString(using: .utf8) else {
        throw Errors.databaseConnectionError("Could not set field separator")
    }
    opt.fieldSep = UnsafeMutablePointer(mutating:fieldSeparator)
Is there a cleaner way this could work, or should this be considered a compiler bug?
Also, why is the conversion to Swift an IUO? NULL is a totally valid value for fieldSep.
Thanks!
-Kenny
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170301/0abea5f8/attachment.html>
    
    
More information about the swift-users
mailing list