2016-09-23 7 views
0

Я пытаюсь использовать strlcpy в Swift 3.0, но продолжаю получать ошибку «Невозможно преобразовать значение типа UnsafeMutablePointer < _>» в ожидаемый тип аргумента '! UnsafeMutablePointer»Использование C в Swift - strlcpy - Невозможно преобразовать значение типа UnsafeMutablePointer <_>

Вот мой код

func login(portal: String, username: String, password: String) { 
    var loginEvent = VidyoClientInEventLogIn() 
    let portalCArray = UnsafeMutablePointer<Int8>(mutating: (portal as NSString).utf8String!) 
    withUnsafeMutablePointer(to: &loginEvent.portalUri) { 
     strlcpy($0, portalCArray, MemoryLayout.size(ofValue: $0)) 
    } 
} 

где VidyoClientInEventLogIn является:

typedef struct VidyoClientInEventLogIn_ 
{ 
    /*! Portal URI, i.e. "https://example.test.com" */ 
    char portalUri[URI_LEN]; 
} VidyoClientInEventLogIn; 

ответ

1

C массивы я переданы Swift как кортежи. Но макет памяти C сохранился в Swift, поэтому вы можете использовать адрес первого элемента кортежа loginEvent.portalUri.0 (который имеет тип CChar aka Int8) в качестве целевого адреса.

Также вы можете пройти Swift String непосредственно в качестве аргумента функции принимает параметр UnsafePointer<CChar>, временная строка C представление создается автоматически.

Это упрощает вещи:

func login(portal: String, username: String, password: String) { 
    var loginEvent = VidyoClientInEventLogIn() 
    strlcpy(&loginEvent.portalUri.0, portal, MemoryLayout.size(ofValue: loginEvent.portalUri)) 
} 
+0

Это работает! спасибо – Lneuner