Как изменить свойства структуры в Swift - PullRequest
1 голос
/ 29 января 2020

Я пробую игровые площадки Swift и не могу найти способ изменить значение структуры. Ниже я хочу изменить свойства Shadow от значений по умолчанию.

Я пробовал синтаксис инициализатора и точки, но я получаю 'поле недоступно из-за уровня внутренней защиты.

let circle = Circle()
circle.draggable = true
//var shadow = Shadow(color: #colorLiteral(red: 0.9529411764705882, green: 0.6862745098039216, blue: 0.13333333333333333, alpha: 1.0), offset: Point(3,-3), blurRadius: 5, opacity: 1)
var shadow = Shadow()
shadow.color = .red
circle.dropShadow = shadow

1 Ответ

1 голос
/ 30 января 2020

Вы, очевидно, используете игровую площадку «Shapes».

Итак, просмотрите источник, нажав «...» »« Дополнительно »» «Просмотр вспомогательных исходных файлов» »« Содержание »» « Модули »» «Book.playgroundmodule» »« Источники »» «PlaygroundAPI».

Если вы посмотрите на структуру Shadow, ни одно из этих свойств не будет объявлено как public. Это означает, что у вас нет доступа к ним вне этого модуля.

В отличие от этого, если вы посмотрите на объявление Circle, напротив, radius будет опубликовано c. И если вы посмотрите на AbstractDrawable, dropShadow тоже public.

При отсутствии явного квалификатора доступа (например, public) свойство получает квалификатор internal доступа Доступно только в этом модуле. (См. Язык программирования Swift: Контроль доступа .) И ваш код в этой игровой площадке находится не в том же модуле, где определено Shadow. Таким образом, у вас нет доступа к нему.

Итак, суть в том, что ваше предупреждение просто говорит вам, что вы не можете получить доступ к этому внутреннему свойству Shadow struct.


Возникает вопрос, почему они объявили Shadow таким, что вы не можете настроить природу тени. Я подозреваю, что это просто недосмотр с их стороны. Например, я открыл эту рабочую тетрадь в XCode и заменил метод init на Shadow следующим:

public init(offset: Point = Point(x: 1, y: -1), blurRadius: Double = 1, opacity: Double = 0.3, color: Color = .black) {
    self.offset = offset
    self.blurRadius = blurRadius
    self.opacity = opacity
    self.color = color
}

Затем я мог бы снова открыть эту игровую площадку на своем iPad и сделать что-то вроде:

let circle = Circle(radius: 30)
circle.dropShadow = Shadow(opacity: 0.9, color: .green)

И это дало:

big circle green shadow

...