2015-09-07 34 views
0

我將Objective-C中的代碼轉換爲Swift,並且在執行字符操作時遇到了問題。特別是,我收到錯誤「不能用(Int16)的參數列表調用CFSwapInt16LittleToHost」。 Objective-C的代碼是:無法在Swift中正確地將參數傳遞給CFSwapInt16LittleToHost

@interface THSampleDataFilter() 
@property (nonatomic, strong) NSData *sampleData; 
@end 

@implementation THSampleDataFilter 

- (id)initWithData:(NSData *)sampleData { 
self = [super init]; 
if (self) { 
    _sampleData = sampleData; 
} 
return self; 
} 
- (NSArray *)filteredSamplesForSize:(CGSize)size { 

    NSMutableArray *filteredSamples = [[NSMutableArray alloc] init];   
    NSUInteger sampleCount = self.sampleData.length/sizeof(SInt16); 
    NSUInteger binSize = sampleCount/size.width; 

    SInt16 *bytes = (SInt16 *) self.sampleData.bytes; 

    SInt16 maxSample = 0; 

    for (NSUInteger i = 0; i < sampleCount; i += binSize) { 

    SInt16 sampleBin[binSize]; 

    for (NSUInteger j = 0; j < binSize; j++) {       
     sampleBin[j] = CFSwapInt16LittleToHost(bytes[i + j]); 
    } 

    SInt16 value = [self maxValueInArray:sampleBin ofSize:binSize];  
    [filteredSamples addObject:@(value)]; 

    if (value > maxSample) {            
     maxSample = value; 
    } 
} 

我的銀行代碼是:

class THSampleDataFilter : NSObject 
{ 
    var sampleData: NSData? 

    init(sampleData: NSData) 
{ 
    super.init() 
    self.sampleData = sampleData 
} 

func filteredSamplesForSize(size: CGSize) -> NSArray? 
{ 
    var filteredSamples = NSMutableArray() 
    var sampleCount:UInt = UInt(Int(self.sampleData!.length)/Int(sizeof(Int16))) 
    var binSize = UInt(sampleCount/UInt(size.width)) 

    var bytes: UnsafePointer<Int16> = UnsafePointer<Int16>(self.sampleData!.bytes) 
    var maxSample: Int16 = 0 

    for var i:UInt = 0; i < sampleCount; i = i + binSize 
     { 
      var sampleBin: [Int16] = [] 

      for var j: UInt = 0; j < binSize; j++ 
      { 
       sampleBin.append(CFSwapInt16LittleToHost(bytes[i + j])) 
      } 

      let value: Int16 = self.maxValueInArray(sampleBin, size: binSize) 
      filteredSamples.addObject(NSNumber(short: value)) 

      if value > maxSample 
      { 
       maxSample = value 
      } 
     } 

問題行是:

sampleBin.append(CFSwapInt16LittleToHost(bytes[i + j])) 

這是我得到的錯誤「無法調用CFSwapInt16LittleToHost帶有(Int16)的參數列表「。我嘗試過所有我能想到的組合。 任何幫助將不勝感激! 謝謝你的期待。

回答

2

CFSwapInt16LittleToHost需要UInt16,而不是Int16

sampleBin.append(CFSwapInt16LittleToHost(UInt16(bytes[i + j]))) 

或更改bytesUInt16指針。

var bytes: UnsafePointer<UInt16> = UnsafePointer<UInt16>(self.sampleData!.bytes) 
+0

嗨傑弗裏 - 謝謝你指出 - 我已經改變了類型匹配和代碼編譯和工作! – Corms

相關問題