2016-06-14 3 views
1

I는 다음과 같이, 포인터를 취하고 그것을 채우는 기능 출력 버퍼로서 신속 어레이가 사용하고스위프트 배열

var buffer : [Int32] = ... 
tehFillFunc(UnsafeMutablePointer<Int32>(buffer)) 

이 잘 작동이 문제는 컴파일러 불평이고 그건 Variable 'buffer' was never mutated; consider changing to 'let' constant입니다. 필자가 채우기 기능에서 돌연변이가 일어 났을 것이라고 확신하고 있기 때문에 싫어합니다.

그래서 침묵 할 수있는 방법이 있습니까? (나는 단지 더미 세트를 할 수는 있지만, 올바르게 설정하는 것을 선호한다).

편집 :

class ViewController: UIViewController { 

    func fill(sth: UnsafeMutablePointer<Int32>) { 
     sth[0] = 7 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var array = [Int32].init(count: 10, repeatedValue: 0) 
     fill(UnsafeMutablePointer<Int32>(array)) 
     print("\(array)") 
    } 
} 

그러나,이 솔루션은 이미 게시했습니다 : (C도 필요하지 않습니다) 문제를 보여줍니다 요청 전체 예제 코드로. 가장 간단한 형식으로 :

 fill(&array) 
+2

코드에 아무런 경고 메시지가 표시되지 않습니다 ... –

+0

@MartinR 맞습니다. 어떻게 원래의 C 함수가 선언되었는지 궁금합니다. – Sulthan

+2

나는'void tehFillFunc (int * ptr);'를 사용했다. –

답변

1

일반적으로 버퍼 크기를 지정해야합니다. 이 목적을 위해 Array의 방법이있다

let bufferSize = 1000 
var buffer = [Int32](count: bufferSize, repeatedValue: 0) 
tehFillFunc(&buffer) 
+0

글쎄, 이것이 내가 원하는 것에 가장 가깝다. 내가 생각했던 것보다 더 단순한 것 같아. – Rychu

1

:

var buffer : [Int32] = ... 

buffer.withUnsafeMutableBufferPointer { 
    tehFillFunc($0.baseAddress) 
} 

내가 배열이 적어도 withUnsafeMutableBufferPointer 반환 될 때까지 살아 확인합니다 그리고이 경우에 나는 다음과 같은 솔루션을 선호합니다. inout 매개 변수가 필요하므로 버퍼는 var이어야합니다.

+1

그게 내가 얼마 전 생각 했었지만, https://forums.developer.apple.com/thread/47085를 이해하면 withUnsafeMutableBufferPointer를 사용하면 단일 함수를 호출 할 필요가 없다. * "Swift는 생성하는 포인터를 보장한다. 이 방법은 함수 호출이 지속되는 동안 유효합니다. "* –

+1

@MartinR 돌연변이의 경우 올바르게 작동한다는 점을 잘 설명합니다. 예를 들어,'didSet' 옵저버가'buffer'에 있으면,'withUnsafeMutableBufferPointer'가 리턴 된 후에 정확하게 한 번 호출됩니다. –

+0

나는 그것이 좋은 지적임을 알았다. (그러나 나는 여전히 컴파일러 경고가 어디서 오는지 궁금하다. 재현 할 수 없다.) –