2017-02-05 3 views
0

성능상의 이유로 내 내부 루프는 C로 변환해야합니다. 그것을 디버깅하려고 노력하고있어 C 구조체에 문자열을 저장할 수 있기를 원합니다. 순간스위프트 문자열을 C로 옮기는 방법

typedef struct Slot { 
    char name[12]; 
    Byte fixed; 
    Byte loaded; 
    Obj obj; 
} Slot; 

이 단지 디버깅을 위해, 그래서 너무 특히이 일어날 수 있도록하는 방법에 대한 아니에요 (즉, 문자 * 이름은? 문자 이름 [12]? 뭔가 다른?)

문자열 미만 12 자 경우

var vars = [String]() 
... 
var i = 0 
for v in vars { 
    let array: [UInt8] = Array(v.utf8) 

    memory.pointee.slots[i].name.0 = Int8(array[0]) 
    memory.pointee.slots[i].name.1 = Int8(array[1]) 
    memory.pointee.slots[i].name.2 = Int8(array[2]) 
    memory.pointee.slots[i].name.3 = Int8(array[3]) 
    memory.pointee.slots[i].name.4 = Int8(array[4]) 
    memory.pointee.slots[i].name.5 = Int8(array[5]) 
    memory.pointee.slots[i].name.6 = Int8(array[6]) 
    memory.pointee.slots[i].name.7 = Int8(array[7]) 
    memory.pointee.slots[i].name.8 = Int8(array[8]) 
    memory.pointee.slots[i].name.9 = Int8(array[9]) 
    memory.pointee.slots[i].name.10 = Int8(array[10]) 
    memory.pointee.slots[i].name.11 = Int8(array[11]) 
} 

어떤 작동하지 않습니다

은 빠른 측면에서이 문자 그대로 내가 지금까지 가지고 올 수있었습니다 최고입니다. (그리고 어쨌든 말도 안돼)

어떻게해야합니까?

편집 : Obtain a pointer to a C char array in Swift의 복제본이 아닙니다. C에서 Swift가 아닌 C로 이동하려고했기 때문에 고정 길이 문자 배열로 제한되지 않았기 때문에 그만한 최고의 솔루션이었습니다. 지금까지 발견.

편집 2 :이 은 의 사본입니다. 어떤 것이 내 문제를 해결 했습니까 (최근 업데이트로). 감사. 당신이 스위프트의 String 유형에서 getCString 방법 원하는처럼

+0

원래 Swift'String' 값은 어디에 있습니까? 'array'와'v.utf8'은 무엇입니까? 그들은 원시 바이트 배열, 신속한 문자 배열,'CChar' 배열 또는 무엇입니까? – Dai

+0

@Dai vars는 문자열 배열, 즉 [String]()입니다. 따라서 v는 단지 String 인스턴스입니다. Array는 UInt8 배열입니다 : [UInt8] 및 v.utf8은 Xcode에 따라 String.UTF8View입니다. – aepryus

답변

0

는 같습니다 : 귀하의 경우 https://developer.apple.com/reference/swift/string/1413114-getcstring

을, 나는 (당신이 당신의 스위프트 String 인 변수 말하지 않았다)이 같은데요.

var str: String = someStringValue 

let nameStart = &memory.pointee.slots[i].name // pointer to the start of the `name` buffer 

str.getCString(nameStart, maxLength: 12) 

(I 정기적 스위프트 사용자 아니에요, 나는 여전히 해요 아마 최신 스위프트 3, 그래서이 코드를 컴파일되지 않습니다하지,하지만 난 당신의 JIST를 얻을 희망합니다 그것)

+0

" '(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)의 값을'[CChar] '"예상 인수 유형으로 변환 할 수 없습니다 " – aepryus

+0

@aepryus See - Swift는'name [12] '를 배열 값 대신 12- 튜플로 해석했다. – Dai

관련 문제