Подтвердить что ты не робот

Как объявить "защищенную" переменную в быстрой

Я хочу создать класс, который наследуется от другого класса, который находится в другом файле.

Например:

Class1.swift

class Class1
{
    protected var 
    //Do Stuff
}

Class2.swift

class Class2:Class1
{
    //Do stuff
}

Как бы мне было легко получить доступ к "защищенной" переменной/функции в swift?

Когда я объявляю приватную переменную/функцию, я могу использовать ее только в этом классе. Если я использую "fileprivate", мой другой класс должен быть в файле сохранения как Class1. То, что я хочу сделать, это сохранить мои классы в файлах seporate и использовать группы из Xcode, чтобы узнать, какой класс принадлежит какой категории.

4b9b3361

Ответ 1

Вам нужно будет использовать internal для этого, поскольку Swift не предлагает ключевое слово protected (в отличие от многих других языков программирования). internal - единственный модификатор доступа между fileprivate и public:

Внутренний доступ позволяет сущности использоваться в любом исходном файле от их определяющего модуля, но не в каком-либо исходном файле за пределами этого модуль. Обычно вы используете внутренний доступ при определении приложений или структуры внутренней структуры.

Существует сообщение в блоге, в котором объясняется немного больше о том, почему языковые дизайнеры решили не предлагать ключевое слово protected (или что-то еще) эквивалент).

Некоторые из причин:

Он действительно не предлагает никакой реальной защиты, поскольку подкласс может всегда выставляйте "защищенный" API через новый публичный метод или свойство.

а также тот факт, что protected может вызвать проблемы при расширении, поскольку неясно, должны ли расширения иметь доступ к свойствам protected или нет.

Ответ 2

Даже если Swift не предоставляет доступ protected, мы можем добиться аналогичного доступа, используя управление доступом t21 > . Единственное, что нам нужно иметь в виду, что мы должны объявить все дети в том же файле, что и родитель, объявленный в.

Animal.swift

import Foundation

class Animal {
    fileprivate var protectedVar: Int = 0
}

class Dog: Animal {
    func doSomething() {
        protectedVar = 1
    }
}

OtherFile.swift

let dog = Dog()
dog.doSomething()