Преобразовать RespondsToSelector и executeSelector из Objective C в Swift - PullRequest
0 голосов
/ 03 июля 2019

Как гласит заголовок, мне трудно преобразовать следующий код из цели c в swift.

UIView * (^viewForContent)(BookObject *) = ^UIView*(BookObject * content) {
    NSString * title = content.title;
    NSString * markdown = nil;
    if ([content respondsToSelector:@selector(markdown)]) {
        markdown = [content performSelector:@selector(markdown)];
    }
    return viewForItem(title, markdown);
};

Ниже моя попытка.

var viewForContent = { (content: BookObject) -> UIView in
    var title = content.title
    var markdown: String? = nil
    if content.responds(to: Selector(markdown!)) {
        markdown = content.perform(Selector(markdown!)) //error: Cannot assign value of type 'Unmanaged<AnyObject>?' to type 'String?'
    }
    return viewForItem(title!, markdown!);
}

BookObject наследуется от NSObject,Проблема с этим кодом заключается в том, что я получаю сообщение об ошибке perform(aSelector: Selector!).Я очень новичок в Swift, и мне было трудно сузить проблему с моим кодом.Что мне здесь не хватает?

РЕДАКТИРОВАТЬ

В соответствии с запросом здесь приводится дополнительная информация о BookObject и о том, что делает этот блок кода.Есть еще один объект с именем BookTextObject, который наследуется от BookObject.Этот BookTextObject имеет свойство markdown, а BookObject - нет.respondsToSelector и performSelector предназначены для того, чтобы проверить, является ли уценка свойством для содержимого, и если да, также установить значение в этом свойстве уценки для этой переменной уценки.

Я не писал этот кодЯ просто пытаюсь преобразовать его в Свифт.Кроме того, никогда не кажется, что результат оператора if будет ложным (т. Е. Кажется, что контент всегда является BookTextObject), но, поскольку я не писал этот код, я бы не стал вынимать ifзаявление о страхе что-то сломать.

1 Ответ

0 голосов
/ 03 июля 2019

Существует еще один объект с именем BookTextObject, который наследуется от BookObject. Этот BookTextObject имеет свойство с именем markdown, но BookObject не

Таким образом, способ написать это в Swift - привести content (BookObject) к BookTextObject (подкласс BookObject) безопасно и условно:

if let bookTextObject = content as? BookTextObject {
    markdown = bookTextObject.markdown
}

Если это единственное, что вам нужно сделать со ссылкой на приведение, вы можете написать ее еще более сжато:

markdown = (content as? BookTextObject)?.markdown

После этой строки локальный markdown будет nil, если мы не сможем сбросить.

...