A UIView
имеет свойство, называемое subViews
, где элементы с более высокими индексами находятся перед элементами с более низкими индексами. Например, subView с индексом 1 находится перед subView с индексом 0.
При этом, чтобы получить кнопку сверху, вы должны отсортировать buttonArray
так же, как организовано свойство subViews
из UIView
. Предполагая, что все ваши кнопки - это братья и сестры одного и того же UIView
(это может быть не обязательно так, но вы можете настроить их так, чтобы они правильно сортировались):
var buttonArray = view.subviews.compactMap { [110] as? UIButton }
Таким образом, сохраняя ваш [117 ] отсортировано таким образом, вы хотите кнопку, которая содержит let point = sender.location(in: button)
с более высоким индексом в массиве.
Я думаю, что это разумно цепочечным конструкторам вместе, но я делаю это другой путь - версия с меньшим количеством параметров называет версию с большим количеством параметров. Тем путем это делает его очень ясным, что происходит, и вся реальная "логика" (вне значений по умолчанию) находится в единственном месте. Например:
public Foo(int x, int y)
{
this.x = x;
this.y = y;
precomputedValue = x * y;
}
private static int DefaultY
{
get { return DateTime.Now.Minute; }
}
public Foo(int x) : this(x, DefaultY)
{
}
public Foo() : this(1, DefaultY)
{
}
Примечание, что, если у Вас есть много перегрузок конструктора, можно хотеть переместиться в статические методы фабрики вместо этого - который обычно делает код более ясным, а также позволяющий несколько методов взять тот же набор параметров, например,
public static XmlDocument FromText(string xml)
public static XmlDocument FromFile(string filename)
Редактирование 2016 года : Все еще перед временем, C# радикально сокращает или устраняет свою поддержку записей и поддержку конструктора по умолчанию C# 7, возможно, C# 8 наконец .
Редактирование 2015 года : Я был далеко впереди времени. C#6 и C#7 устраняют необходимость конструкторов.
, Если Вы разрабатываете в.Net 3.5, я никогда рекомендую не использовать конструкторов. Единственное исключение я уезжаю в это, - то, при использовании инжекционного конструктора для внедрения зависимости. С.Net 3.5 они инициализаторы созданного объекта, которые позволяют Вам делать
var myclass = New MyClass { arg1 = "lala", arg2 ="foo" }
Этот, будут initalize класс со значениями, присвоенными для arg1 и arg2 при отъезде arg3 как
default(typeof(arg3)).