2016-10-27 2 views
0

Мне нужно вызвать следующий API в заголовке object-c в J2Objc.Быстрое преобразование 2 - 3 UnsafePointer <UInt8>

/** 
* Create a new array of a specified length, setting the elements to the values in buf. 
*/ 
class IOSByteArray: NSObject { 
... 
+ (instancetype)newArrayWithBytes:(const jbyte *)buf count:(NSUInteger)count; 
... 
} 

В быстром 2, я мог бы сделать следующее:

func myFunc() -> IOSByteArray { 
     return IOSByteArray.newArray(withBytes: UnsafePointer<UInt8>(data.bytes), count: UInt(data.count)) 
} 

В быстром 3, я получаю ошибку:

"Cannot invoke initializer for type 'UnsafePointer<UInt8>' with an argument list of type '(Array<UInt8>)'" 

Я не могу понять, как сделать эквивалентный вызов in swift 3.
Получаю, что https://swift.org/migration-guide/se-0107-migrate.html#automatic-migration-cases дает объяснение причин и способов. Но для меня это слишком эрудитивно.

Помощь!

+0

Что тип переменных данных в myFunc()? –

+0

Данные являются объектами NSData. – Navi

+0

, пожалуйста, проверьте мой ответ, вы должны использовать данные в Swift 3 вместо NSData –

ответ

0

В Swift 3 вы должны использовать Data класс вместо NSData

С классом данных можно использовать withUnsafeBytes, чтобы получить конвертировать байты в UnsafePointer и сделать это как этот

func myFunc() -> IOSByteArray { 
    return data.withUnsafeBytes({ (unsafeBytes: UnsafePointer<UInt8>) -> IOSByteArray in 
     return IOSByteArray.newArray(withBytes: unsafeBytes, count: UInt(data.count)) 
    } 
} 
+0

Пробовал это также. – Navi

+0

@Navi Понравилась ошибка? Если да, вы можете вставить ошибку в комментарии? –

+0

Спасибо! Это сработало! – Navi

Смежные вопросы