2014-06-07 5 views

cevap

18

bu kolayca mümkün olduğunu sanmıyorum. Aynı şekilde, NSArray ile çalışan parametreler için C stili dizileri kullanamazsınız. Swift

Tüm C dizileri, örneğin bir UnsafePointer, ile temsil edilmektedir UnsafePointer<Float>. Swift, verilerin bir dizi olduğunu bilmiyor. Bunları bir Swift dizisine dönüştürmek istiyorsanız, yeni bir nesne oluşturacak ve öğeleri tek tek kopyalayacaksınız.

let array: Array<Float> = [10.0, 50.0, 40.0] 

// I am not sure if alloc(array.count) or alloc(array.count * sizeof(Float)) 
var cArray: UnsafePointer<Float> = UnsafePointer<Float>.alloc(array.count) 
cArray.initializeFrom(array) 

cArray.dealloc(array.count) 

Düzenleme Sadece bu aslında kopyalamayı önlemek olabilir, daha iyi bir çözüm buldum. Beta 5 de

let array: Array<Float> = [10.0, 50.0, 40.0] 

// .withUnsafePointerToElements in Swift 2.x 
array.withUnsafeBufferPointer() { (cArray: UnsafePointer<Float>) ->() in 
    // do something with the C array 
} 
+0

güvenli olmayan işaretçi m dizi elde etmek için blok baseAddress yöntemi kullanmak ne kadar süreyle ayrılacağını bilmediği için içerikleri kopyalayın? – jhabbott

+0

@jhabbott İşte bu yüzden "güvensiz" :). Dizinin <> iç sunumuna bağlı olarak <> bir kopyası zaten mevcut değilse, bitişik bir bellek alanına kopyalamak zorunda kalabilir, ancak bu muhtemelen uygulamada/makul olmayan bir olasılıktır. – Ephemera

+2

"withUnsafePointerToElements" işlevi kaldırıldı: "https://developer.apple.com/library/mac/releasenotes/General/APIDiffsMacOSX10_10_3/modules/Swift.html – marchinram

7

, tek bir sadece Aşağıdaki örnek, bir VDSP C işlev 2 yüzer diziler geçer & dizi geçmesi kullanabilir: withUnsafePointerToElements() yöntem uzaklaştırılmış

let logLen = 10 
let len = Int(pow(2.0, Double(logLen))) 
let setup : COpaquePointer = vDSP_create_fftsetup(vDSP_Length(logLen), FFTRadix(kFFTRadix2)) 

var myRealArray = [Float](count: len, repeatedValue: 0.0) 
var myImagArray = [Float](count: len, repeatedValue: 0.0) 
var cplxData = DSPSplitComplex(realp: &myRealArray, imagp: &myImagArray) 

vDSP_fft_zip(setup, &cplxData, 1, vDSP_Length(logLen),FFTDirection(kFFTDirection_Forward)) 
+9

Nasıl bir örnek yok gerçek dünya kodunu gösterme Göstermeye çalıştığınız ve hangi C API'sinin yalnızca bir parçası olduğunuzu çok açık değil. –

+0

@AbhiBeckert DSPSplitComplex, bir C API'si olan ve iyi bir örnek olan Apple Accelerate çerçevesinin bir parçasıdır. Karmaşık sayıların bir vektörünü tutmak için basit bir yapıdır. –

+0

Swift 3'ten itibaren Array init şu anda: 'var myRealArray = [Float] (yinelenen: 0,0, count: len)' –

8

, şimdi kullanabilir yerine withUnsafeBufferPointer() ve noktası Şüphesiz

let array: Array<Float> = [10.0, 50.0, 40.0] 
array.withUnsafeBufferPointer { (cArray: UnsafePointer<Float>) ->() in 
    cArray.baseAddress 
}