我有两个示例函数。两者都完全相同。不同之处在于变量" objectName"的类型。
第一个作品。我是具体的,并将类型设置为UILabel。显然我只能将它与UILabel类型的对象一起使用,并为每种类型重新创建函数只是丑陋。
func _setUILabelTop(objectName: UILabel, location: CGFloat, offset: CGFloat) {
let originalBottom = objectName.frame.origin.y + objectName.frame.size.height
objectName.frame.origin.y = location + offset
objectName.frame.size.height = originalBottom - objectName.frame.origin.y
}
第二个不起作用。使用了AnyObject,XCode在第2行和第2行给出了错误。 3的功能。它突出显示文本 objectName.frame 并带有错误:无法分配给类型' CGFloat'
的不可变表达式func _setObjectTop(objectName: AnyObject, location: CGFloat, offset: CGFloat) {
let originalBottom = objectName.frame.origin.y + objectName.frame.size.height
objectName.frame.origin.y = location + offset
objectName.frame.size.height = originalBottom - objectName.frame.origin.y
}
我的问题:
请保持温和,我只使用过XCode& amp; Swift几天,这也是我的第一篇StackOverflow帖子。 =)
答案 0 :(得分:0)
为任何对象设置顶部位置没有意义,因为并非所有对象都具有此属性 - 例如NSString
。但是,您可以使用UIView
代替AnyObject
来获取所需的行为,因为几乎(如果不是)所有UIKit
控件都派生自此类。
func _setTop(forView view: UIView, location: CGFloat, offset: CGFloat) {
let originalBottom = view.frame.origin.y + view.frame.size.height
view.frame.origin.y = location + offset
view.frame.size.height = originalBottom - view.frame.origin.y
}
关于计算,您可以优化originalBottom
计算:
let originalBottom = view.frame.maxY