【问题标题】:AnyObject & Cannot assign to immutable expression of type 'CGFloat'AnyObject & 无法分配给“CGFloat”类型的不可变表达式
【发布时间】:2017-05-16 09:54:41
【问题描述】:

我有两个示例函数。两者都做同样的事情。区别在于变量“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 行和第 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. 是否有更好的方法来指定上、下、左或右 单独属性,无需计算宽度?

请轻点,我使用 XCode 和 Swift 才几天,这也是我在 StackOverflow 上的第一篇文章。 =)

【问题讨论】:

    标签: ios swift cgfloat anyobject


    【解决方案1】:

    为任何对象设置顶部位置没有意义,因为并非所有对象都具有此属性 - 例如 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
    

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多