2016-11-10 7 views
1

У меня возникли две серьезные проблемы при попытке обновить библиотеку, которая включает в себя экспорт файлов в Swift 3. Я прочитал apple/swift migration page, но все еще не уверен, что именно лучший способ пойти в убедитесь, что я не потерял ни одного из этих байтов. Множество примеров - это преобразование строки, но мне действительно нужны байты.Swift 3 Небезопасный указатель Неопределенный указатель и байты

Первая проблема, которая возникает у меня, заключается в каждой строке ниже, которая начинается с stream.write, UnsafePointer<UIntX>(&var) возвращает ошибку, указанную Ambigious use of init.

var xbuffer = [UInt8](repeating: 0, count: 2048 + 171*1024) 
let stream : OutputStream = OutputStream(toBuffer: &xbuffer, capacity: 2048 + 171*1024); 
stream.open(); 

//Version number (2 bytes) 
stream.write(Data(bytes: UnsafePointer<UInt8>(&(self.version)), count: 1).bytes.bindMemory(to: UInt8.self, capacity: Data(bytes: UnsafePointer<UInt8>(&(self.version)), count: 1).count),maxLength: 1); 

stream.write(Data(bytes: UnsafePointer<UInt8>(&(self.subVersion)), count: 1).bytes.bindMemory(to: UInt8.self, capacity: Data(bytes: UnsafePointer<UInt8>(&(self.subVersion)), count: 1).count),maxLength: 1); 

//Operation ID status code (2 bytes) 
var opId_big = CFSwapInt16HostToBig(self.operationId); 
stream.write(Data(bytes: UnsafePointer<UInt8>(&(opId_big)), count: 2).bytes.bindMemory(to: UInt8.self, capacity: Data(bytes: UnsafePointer<UInt8>(&(opId_big)), count: 2).count),maxLength: 2); 

//Request ID (4 bytes) 
requestId = requestId | 0x1; 
var rqid_big = CFSwapInt32HostToBig(requestId); 
stream.write(Data(bytes: UnsafePointer<UInt8>(&(rqid_big)), count: 4).bytes.bindMemory(to: UInt8.self, capacity: Data(bytes: UnsafePointer<UInt8>(&(rqid_big)), count: 4).count), maxLength: 4); 

Я был в состоянии изменить это, выполняя изменения UnsafeRawPointer и UnsafeBufferPointer при создании Data.

После этого у меня есть еще одна проблема, когда Xcode напечатает ошибку, которая bytes is unavailable use withUnsafeBytes instead.

В целом, я могу исправить мелкие части по частям, используя такие вещи, но из-за всех цепочных команд у меня возникают проблемы с внесением нескольких изменений и попытками решений stackoverflow и быстрой миграцией из-за множества требуемых изменений по цепным командам.

Я ценю любые ответы или просвещение/направление.

Other Migration Page That Was Helpful

StackOverFlow Reference 1

ответ

0

Вообще, у вас нет необходимости создавать промежуточные Data писать последовательности байтов в OutputStream.

var xbuffer = [UInt8](repeating: 0, count: 2048 + 171*1024) 
    xbuffer.withUnsafeMutableBufferPointer{bufferPointer in 
     let stream : OutputStream = OutputStream(toBuffer: bufferPointer.baseAddress!, capacity: xbuffer.count); 
     stream.open(); 

     //Version number (2 bytes) 
     withUnsafeBytes(of: &self.version) { 
      stream.write($0.baseAddress!.assumingMemoryBound(to: UInt8.self), maxLength: 1) 
     } 

     withUnsafeBytes(of: &self.subVersion) { 
      stream.write($0.baseAddress!.assumingMemoryBound(to: UInt8.self), maxLength: 1) 
     } 

     //Operation ID status code (2 bytes) 
     var opId_big = self.operationId.bigEndian 
     withUnsafeBytes(of: &opId_big) { 
      stream.write($0.baseAddress!.assumingMemoryBound(to: UInt8.self), maxLength: 2) 
     } 

     //Request ID (4 bytes) 
     var rqid_big = (requestId | 0x1).bigEndian; 
     withUnsafeBytes(of: &rqid_big) { 
      stream.write($0.baseAddress!.assumingMemoryBound(to: UInt8.self), maxLength: 4) 
     } 
    } 
+0

Я попробую сегодня. Спасибо за ответ. Я новичок в быстром и написал суть этой библиотеки в объективе-c давным-давно. Это было бы очень полезно, если оно работает! – napkinsterror