AnyObject&无法分配给类型' CGFloat'的不可变表达式。

时间:2017-01-02 09:39:19

标签: ios swift cgfloat anyobject

我有两个示例函数。两者都完全相同。不同之处在于变量" 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
}

我的问题:

  1. 是否有允许UILabel,UIButton,MKMapView
  2. 的对象类型
  3. 是否有更好的方法来指定Top,Bottom,Left或Right 单独的属性,而不必计算宽度?
  4. 请保持温和,我只使用过XCode& amp; Swift几天,这也是我的第一篇StackOverflow帖子。 =)

1 个答案:

答案 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