在Swift中,如何使用setValueForKey设置对象的textAlignment属性?

时间:2014-11-20 07:36:38

标签: dynamic reflection swift

我们假设我们定义了一个这样的对象:

let object: AnyObject = {

    var result = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
    result.text = "First Text"
    result.backgroundColor = UIColor.blueColor()

    return result
}()

对于这个例子,我明确地创建了一个UILabel,但在我的实际项目中,我不知道创建了什么类型的对象,所以我只是将结果视为{{1这个例子。该对象只是一个标准的UILabel,其文本为" First Text"在蓝色背景上,默认情况下左对齐。

在这个例子中,我知道这个对象实际上是AnyObject,所以我知道我可以改变它的属性,如下所示:

UILabel

现在我改变了文字。但是在我的实际项目中,我不知道我的对象是(object as UILabel).text = "Second Text" ,所以我不能只做UILabel伎俩,因为它并不总是(object as UILabel)。我的方法是使用UILabel。在检查我的对象有一个名为" text"使用setValueForKey(此示例中未显示),我可以通过这种方式更改文本:

respondsToSelector

现在,如果我想更改对象的object.setValue("Third Text", forKey: "text") ,在检查对象确实有一个名为textAlignment的成员后,我想做这样的事情:< / p>

textAlignment

这样做会导致错误:

object.setValue(NSTextAlignment.Center, forKey: "textAlignment")

我在设置Type 'NSTextAlignment' does not conform to protocol 'AnyObject' 时尝试这种方法遇到了类似的事情,因为它不喜欢frame类型,但我能够通过转换{{{{}}来解决这个问题。 1}}到CGRect。但是,我找不到像CGRect这样的NSValue类型修复方法。

有人知道如何在这里实现我的目标吗?

2 个答案:

答案 0 :(得分:4)

您必须使用原始值NSTextAlignment.Center.rawValue

 object.setValue(NSTextAlignment.Center.rawValue, forKey: "textAlignment")

答案 1 :(得分:0)

另一种选择是声明具有您感兴趣的属性的协议,然后扩展您要使用的类型以采用该协议。如果在这种情况下对你有用,那似乎更安全。