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 개발 에 관 한 글 이 아직 많 습 니 다.검색 하여 찾 아 보 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.