swift 이전 언어인 objective - c 는 c기반 언어여서 c코드를 사용 할 수 있었다. Swift로 리펙토링 하던 도중 기존 Objective -C ViewConroller에서 사용중인 코드에서 다수의 메모리 주소 접근을 하는 c코드를 리펙토링하게 되었고 해당 코드를 Swif로 번역 하던 도중 스위프트에서도 포인터 기능을 지원해 주는 것을 배우게 되었음.
#define ENC_PROPERTY_FIELD_SIZE 32
typedef struct _ENC_PROPERTY_FIELD
{
char szField_01[ENC_PROPERTY_FIELD_SIZE];
char szField_02[ENC_PROPERTY_FIELD_SIZE];
char szField_03[ENC_PROPERTY_FIELD_SIZE];
char szField_04[ENC_PROPERTY_FIELD_SIZE];
char szField_05[ENC_PROPERTY_FIELD_SIZE];
char szField_06[ENC_PROPERTY_FIELD_SIZE];
char szField_07[ENC_PROPERTY_FIELD_SIZE];
char szField_08[ENC_PROPERTY_FIELD_SIZE];
char szField_09[ENC_PROPERTY_FIELD_SIZE];
char szField_10[ENC_PROPERTY_FIELD_SIZE];
} ENC_PROPERTY_FIELD;
-(void) someFunction(){
ENC_PROPERTY_FIELD stEncPropertyField;
ENC_PROPERTY_VALUE stEncPropertyValue;
memset(&stEncPropertyField, 0x0, sizeof(ENC_PROPERTY_FIELD));
memset(&stEncPropertyValue, 0x0, sizeof(ENC_PROPERTY_VALUE));
NSString *strPF1 = [NSString stringWithUTF8String:stEncPropertyField.szField_01];
}
대충 이런 구조체를 선언하고 구조체에 char 배열에서 NSString으로 값을 얻어오는 코드였다.
func someFunction(){
var stEncPropertyField :ENC_PROPERTY_FIELD = ENC_PROPERTY_FIELD()
var stEncPropertyValue :ENC_PROPERTY_VALUE = ENC_PROPERTY_VALUE()
let a = String(cString: stEncPropertyField.szField_01)
}
로 코드를 수정하면 stEncPropertyField.szField01이 (CChar, …..,CChar)라 번역 불가능
[UInt8](UnsafeRawBufferPointer(start: &stEncPropertyField.szField01.0, count: 32))로 배열을 첫 원소 주소값에 접근 하여 32사이즈만큼 [UInt8] 배열을 생성하고 그결과를
func getCCharArray(encProField:[UInt8])->String{
let msg = UnsafeMutablePointer<[UInt8]>.allocate(capacity: encProField.count)
msg.initialize(to: encProField)
return String(cString: msg.pointee)
}
함수에 파라메터로 전달
UnsafeMutablePointer로 cString 을 해주어야 변환이 가능했다.