Ошибка отражения при преобразовании в Swift 4 в свойствах Objective-C - PullRequest
0 голосов
/ 26 апреля 2019

Получение сообщения об ошибке

Невозможно преобразовать значение типа 'UnsafeMutablePointer ?' (иначе 'Необязательно ') для указанного типа 'UnsafeMutablePointer ' (иначе 'UnsafeMutablePointer <Необязательно <OpaquePointer>>')

В этой строке

let properties : UnsafeMutablePointer <objc_property_t?> = class_copyPropertyList(self.classForCoder, &count)

Полный код здесь

var count = UInt32()
let properties : UnsafeMutablePointer <objc_property_t?> = class_copyPropertyList(self.classForCoder, &count)
var propertyNames = [String]()
let intCount = Int(count)
for i in 0..<intCount {
    let property : objc_property_t = properties[i]!
    guard let propertyName = NSString(utf8String: property_getName(property)) as? String else {
        debugPrint("Couldn't unwrap property name for \(property)")
        break
    }

    propertyNames.append(propertyName)
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Вы получаете сообщение об ошибке, потому что тип возврата class_copyPropertyList не UnsafeMutablePointer<objc_property_t?>.

Ваша строка должна выглядеть так:

let properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(self.classForCoder, &count)
0 голосов
/ 26 апреля 2019

Вы можете удалить аннотацию типа, например так:

var count = UInt32()
let properties = class_copyPropertyList(self.classForCoder, &count)

Теперь свойства также могут быть сопоставлены:

if let properties = class_copyPropertyList(self.classForCoder, &count) {
    let range = 0..<Int(count)
    let names = range.map {
        String(cString: property_getName(properties[$0]))
    }
}
0 голосов
/ 26 апреля 2019

class_copyPropertyList() возвращает UnsafeMutablePointer<objc_property_t>?, а не UnsafeMutablePointer<objc_property_t?>.Обычно лучше избегать явных аннотаций типов и просто писать

let properties = class_copyPropertyList(self.classForCoder, &count)

и позволить компилятору выводить тип.Затем необязательное значение необходимо развернуть, например, с помощью guard:

guard let properties = class_copyPropertyList(self.classForCoder, &count) else {
    return // Handle error ...
}

Создание Swift String также можно упростить, что приведет к

var count = UInt32()
guard let properties = class_copyPropertyList(self.classForCoder, &count) else {
    return
}
var propertyNames = [String]()
for i in 0..<Int(count) {
    let propertyName = String(cString: property_getName(properties[i]))
    propertyNames.append(propertyName)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...