2017-01-02 3 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 & 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. Есть ли лучший способ указать Top, Bottom, Left OR Right свойства индивидуально, без необходимости рассчитать ширину?

Пожалуйста, будьте осторожны, я использую только 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 
} 

Что касается расчетов, вы можете оптимизировать originalBottom вычисления:

let originalBottom = view.frame.maxY 
Смежные вопросы