我们假设我们定义了一个这样的对象:
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
类型修复方法。
有人知道如何在这里实现我的目标吗?
答案 0 :(得分:4)
您必须使用原始值NSTextAlignment.Center.rawValue
object.setValue(NSTextAlignment.Center.rawValue, forKey: "textAlignment")
答案 1 :(得分:0)
另一种选择是声明具有您感兴趣的属性的协议,然后扩展您要使用的类型以采用该协议。如果在这种情况下对你有用,那似乎更安全。