3

Я пытаюсь реализовать следующую библиотеку в моем проекте:вопросы уровня защиты при доступе на структуру в расширении

https://github.com/knutigro/COBezierTableView

Чтобы использовать это, следующие свойства могут быть заданы пользовательские значения:

public extension UIView { 

    public struct BezierPoints { 

     static var p1 = CGPoint.zero 
     static var p2 = CGPoint.zero 
     static var p3 = CGPoint.zero 
     static var p4 = CGPoint.zero 
    } 
} 

В моей MainVC это настраивается следующим образом:

UIView.BezierPoints.p1 = CGPoint(... 
UIView.BezierPoints.p2 = CGPoint(... 
UIView.BezierPoints.p3 = CGPoint(... 
UIView.BezierPoints.p4 = CGPoint(... 

В демонстрационном проекте Swift 2.3 ошибок нет. В проекте Swift 3 я получаю ошибку:

«p1 недоступен из-за« внутреннего »уровня защиты».

Может кто-то пролить свет на проблему здесь, я предполагаю, что у Swift 3 есть некоторые новые разрешения за кулисами, которые необходимо переопределить.

ответ

6

Я думаю, расширение, о котором вы говорите, не находится в той же цели, что и ваш MainVC?

Поскольку p1 и т.д. не имеют уровень защиты, назначенный (а struct не private), они автоматически internal. Это означает, что вы можете получить доступ только к этим свойствам в пределах одной и той же цели.

Но это было также в более ранних версиях Swift. Я не знаю, почему ваш код когда-либо работал.

+2

О, конечно! Мне не пришло в голову, что у демонстрационного проекта не было одинаковых целей. Изменение свойств для общественности разрешило эту проблему, и я также нашел этот полезный ресурс https://www.andrewcbancroft.com/2015/04/22/3-nuances-of-swift-extensions/ –