正如标题所述,我很难将下面的代码从目标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!)
函数出现错误。我是新手,我一直很难解决我的代码问题。我在这里想念什么?
编辑
这里要求提供有关BookObject以及此代码块正在做什么的更多信息。还有一个称为BookTextObject的对象,该对象继承自BookObject。此BookTextObject具有一个称为markdown的属性,但BookObject没有。 respondsToSelector
和performSelector
可以检查markdown是否是内容的属性,如果是,还可以将该markdown属性中的值设置为此markdown变量。
我没有编写此代码,我只是想将其转换为快速代码。此外,if语句的结果似乎永远不会为假(即,内容始终是一个BookTextObject),但是由于我没有编写此代码,所以我宁愿不要取出if害怕破坏某些东西的声明。
答案 0 :(得分:0)
还有一个名为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
。