Swift 에서 C 언어 인터페이스 캐 시 사용 및 배열 과 문자열 을 포인터 형식 으로 바 꾸 는 방법

4007 단어 SwiftC 언어캐 시
Swift 에서 C 언어 인터페이스 캐 시 사용 및 배열 과 문자열 을 포인터 형식 으로 바 꾸 는 방법
Swift 프로 그래 밍 언어 는 상위 프로 그래 밍 언어 에 속 하기 때문에 Swift 에 서 는 저층 의 고성능 컴 퓨 팅 인 터 페 이 스 를 위해 C 언어의 포인터 유형 이 필요 합 니 다.따라서 Swift 프로 그래 밍 언어 가 탄생 했 을 때 UnsafePointer 와 UnsafeMutablePointer 유형 이 있 었 고 각각 const Type*유형 과 Type*유형 에 대응 합 니 다.
한편,Swift 프로 그래 밍 언어 에 서 는 일반 배열(Array)대상 이 C 언어 에 포인터 형식의 함수 인자(예 를 들 어 void*)를 직접 사용 할 수 없 기 때문에 배열 을 포인터 형식 으로 바 꾸 고 배열 의 요소 내용 을 연속 적 인 저장 공간 에 저장 해 야 합 니 다.또한 Swift 의 문자열 대상 은 모두 String 구조 체 대상 이 므 로 C 언어 에서 const char*형식 이 호 환 되 는 유형 으로 변환 해 야 하기 때문에 Objective-C 의 Foundation 라 이브 러 리 가 아 닌 간편 하고 순수한 Swift 인터페이스의 사용 방법 을 소개 합 니 다.

/**
           (Array)         1  
 - parameters:
  - p: inout [Int]  ,          
 - returns: Void
*/
func test(inout p: [Int]) {
  p[0] += 1
}

class ViewController: NSViewController {
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    var a = 0
    
    //     UnsafeMutablePointer   alloc     10 Int       
    //            malloc      ,     C      
    let buf = UnsafeMutablePointer<Int>.alloc(10)
    let dst = UnsafeMutablePointer<Int>.alloc(10)
    
    //    buf dst           
    for i in 0 ..< 10 {
      buf[i] = i
      dst[i] = 0
    }
    
    //   assignBackwardFrom buf      5      dst      5    
    dst.assignBackwardFrom(buf.advancedBy(5), count: 5)
    
    //  Array    10 Int       arr
    var arr = [Int](count: 10, repeatedValue: 0)
    
    //  dst         arr 
    for i in 0 ..< 10 {
      arr[i] = dst[i]
    }
    print(arr)
    
    //   buf dst。  ,     dealloc   ,         alloc     !
    //           
    buf.dealloc(10)
    dst.dealloc(10)
    
    // arr         [1, 2, 3]        Array  
    arr = [1, 2, 3]
    
    //   test  ,  arr         1
    test(&arr)
    print("arr = \(arr)")
    
    //     Array withUnsafeMutableBufferPointer           
    //               。
    //   p    :UnsafeMutablePointer<Int>
    let p = arr.withUnsafeMutableBufferPointer() {
      //   ,         UnsafeMutableBufferPointer   ,
      //      UnsafeMutablePointer     。
      (inout buffer: UnsafeMutableBufferPointer<Int>) -> UnsafeMutablePointer<Int> in
      return buffer.baseAddress
    }
    
    a = 0
    
    //                  
    for i in 0 ..< 3 {
      a += p[i]
    }
    print("a = \(a)")
    
    //     p       arr       
    p[0] -= 1
    p[1] += 1
    p[2] += 2
    
    //          arr          
    print("arr is: \(arr)")
    
    //    nulTerminatedUTF8     ContiguousArray<CodeUnit>    ,
    //   ,CodeUnit UInt8  。
    //    withUnsafeBufferPointer  UnsafePointer<CChar>  
    let cstr = "abcd".nulTerminatedUTF8.withUnsafeBufferPointer() {
      return UnsafePointer<CChar>($0.baseAddress)
    }
    
    //          UnsafePointer<CChar>   C       String  
    let string = String.fromCString(cstr)!
    print("string is: \(string)")
  }
}

상기 코드 에서 UnsafeMutablePointer 의 alloc 방법 도 좋 은 방법 입 니 다.이 방법 은 C 언어 표준 라 이브 러 리 malloc 에 대한 패 키 징 이 어야 합 니 다.우 리 는 Swift 에서 연속 적 인 저장 공간 을 편리 하 게 분배 할 수 있 습 니 다.예 를 들 어 이미지 처리,행렬 계산 등 알고리즘 에 특히 실 용적 입 니 다.물론 우리 의 논 리 는 주로 Array 로 처리 한 다음 에 바 텀 C 언어 인터페이스 에 고성능 계산 을 한다 면 배열 대상 을 연속 저장 공간 으로 전환 하 는 withUnsafeBuffer Pointer 방법 도 사용 할 수 있다.이런 처리 방식 은 네트워크 데이터 통신 에서 도 비교적 실 용적 이다.
궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주시 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 주 십시오.본 사이트 의 IOS 개발 에 관 한 글 이 아직 많 습 니 다.검색 하여 찾 아 보 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기