В том же пакете, где объявлен защищенный член, разрешен доступ:
package package1;
public class C extends A{
public void go(){
A a = new A();
System.out.println(a.protectedInt); // got printed
C c = new C();
System.out.println(c.protectedInt); // got printed as well
}
}
Вне пакета, в котором объявлен защищенный член, доступ разрешен тогда и только тогда, когда по коду, который отвечает для реализации этого объекта. В этом случае C отвечает за реализацию этого объекта, поэтому он может получить доступ к защищенным.
package package2;
public class C extends A{
public void go(){
A a = new A();
System.out.println(a.protectedInt); // compiler complains
C c = new C();
System.out.println(c.protectedInt); // got printed
}
}
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)
с более высоким индексом в массиве.
Есть способ прогуляться. Похоже, что вы просто хотите, чтобы ваш жест оказался на одну кнопку выше всех остальных, добавив var вне цикла и каждый раз, когда нажимали кнопку, сравнивая с var ее уровня в точке z.
case .ended:
var pickedButton: UIButton?
for button in buttonArray {
let point = sender.location(in: button)
if button.layer.contains(point){
if pickedButton == nil {
pickedButton = button
} else {
if let parent = button.superView, parent.subviews.firstIndex(of: button) > parent.subviews.firstIndex(of: pickedButton!) {
pickedButton = button
}
}
}
}
//DO my Action with pickedButton here
lineShape.path = nil
lineShape.removeFromSuperlayer()