2017-01-02 76 views
-1

我有兩個示例函數。兩者都完全一樣。區別在於變量「objectName」的類型AnyObject&不能分配給類型'CGFloat'的不可變表達式

第一件作品。我是具體的,並將類型設置爲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行上給我一個錯誤。它突出了文字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後。 =)

回答

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 
} 

關於計算,可以優化​​計算:

let originalBottom = view.frame.maxY