Декларация действительна только при ошибке области файла - PullRequest
0 голосов
/ 28 января 2020

Может кто-нибудь объяснить мне, почему расширение работает таким образом.

Я написал расширение для моего основного ViewController, которое включает в себя функцию:

extension WeatherMainScreen {
    func load(lat: Double, long: Double){
        service.getWeatherInfo(lat: lat, long: long) { [weak self] temp in
            self?.tempNumber.text = "\(temp.currently.temperature)"
            self?.results = temp.daily.data
            self?.tableView.reloadData()
         }
     }
 }

Проблема в том, что если я поместив это расширение в класс ViewController, я получаю сообщение об ошибке «Объявление действует только в области действия файла». Но если я поставлю выше, это работает нормально.

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

Вопрос в том, почему работает расширение над классом V C, но если я помещаю под класс V C, это показывает эта ошибка «Декларация действительна только в области видимости файла»?

Дополнительные пояснения

Этот способ не работает, показывая ошибку объявления:

class WeatherMainScreen: UIViewController {
}
extension WeatherMainScreen {
// your code
}

Так работает :

extension WeatherMainScreen {
// your code
}
class WeatherMainScreen: UIViewController {
}

Я не ставлю расширение внутри класса

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вопрос в том, почему работает расширение над классом V C, но если я добавляю класс V C, это показывает, что эта ошибка "Объявление действительна только в области видимости файла"?

Ответ: Расширения должны быть на уровне root, а не внутри какого-либо класса.

Это неправильно. Поскольку расширение вложено в WeatherMainScreen

class WeatherMainScreen: UIViewController { 
    extension WeatherMainScreen { // wrong as its declared inside the WeatherMainScreen
    // your code
    }
}

Это правильно, так как расширение объявлено на уровне root

class WeatherMainScreen: UIViewController {
}
extension WeatherMainScreen { // correct way.
// your code
}
0 голосов
/ 28 января 2020

Размер ViewController не имеет значения. Положить контроллер представления в любом месте будет работать. Вы можете узнать больше о модификаторах доступа Swift от здесь .

Также убедитесь, что WeatherMainScreen это public или open класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...