2015-09-07 311 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

相关问题