Ios 确定实例在Swift中运行时是否具有可设置属性

Ios 确定实例在Swift中运行时是否具有可设置属性,ios,objective-c,swift,introspection,Ios,Objective C,Swift,Introspection,我正在将旧代码移植到Swift。我编写了一个自定义输入视图,它与我的某些自定义视图一起工作。下面是我用来附加输入视图的方便方法: + (POGramophoneView *)attachToView:(UIView *)view delegate:(id)delegate { if ([view.inputView isKindOfClass:self]) return (POGramophoneView *)view.inputView; POGramophoneView *

我正在将旧代码移植到Swift。我编写了一个自定义输入视图,它与我的某些自定义视图一起工作。下面是我用来附加输入视图的方便方法:

+ (POGramophoneView *)attachToView:(UIView *)view delegate:(id)delegate
{
    if ([view.inputView isKindOfClass:self]) return (POGramophoneView *)view.inputView;

    POGramophoneView *gramophone = [[POGramophoneView alloc] initWithFrame:CGRectMake(0, 0, 1024, 267)];

    gramophone.attachedView = view;

    NSAssert([view respondsToSelector:@selector(setInputView:)], @"Gramophone view %@ cannot attach to %@ because it does not respond to setInputView:", gramophone, view);

    // This line
    [view performSelector:@selector(setInputView:) withObject:gramophone];

    [view reloadInputViews];

    return gramophone;
}
由于
UIView
inputView
是只读的,因此我必须检查传递给我的视图是否可以设置输入视图。我不知道该如何将标记的线路转接到Swift。如何检查传递的视图是否已声明为可设置的
inputView

class func attachToView(view: UIView, delegate: POGramophoneViewDelegate) -> POGramophoneView {
    if view is POGramophoneView {
        return view
    }

    var gramophone = POGramophoneView(frame: CGRectMake(0, 0, 1024, 267))
    gramophone.attachedView = view

    // set inputview to new gramophone
    view.reloadInputViews()

    return gramophone
}

Swift提供了将字符串文字转换为选择器数据类型的函数。你可以这样写

if view.respondsToSelector(Selector("setInputView:")) {
    // To call the selector use KVO technique.
    view.setValue(gramophone, forKey:"inputView");
}

没关系,但我该如何调用选择器呢?不,不会
UIView
没有声明
setInputView:
。哦,我明白了…,试着像KVO一样使用_view.setValue(留声机,forKey:“inputView”)。这可能不是最好的方法,但我想不出任何其他方法,除非你改变你的设计并使用多态性。谢谢,这很有效。将它添加到您的答案中,我会接受它。仅供参考,您可以在要求使用
选择器的地方直接传递字符串文本。不需要convert.NSAssert和performSelector是愚蠢的-您只需调用该方法即可。方法调用有一个内置的断言,表明选择器存在。