Как объявить тип переменной в зависимости от троичного выражения? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть это перечисление:

enum WeatherMapDisplayType {
    case temperature
    case wind
}

Могу ли я объявить переменную, подобную этой?

let markerView: mode == .temperature ? WeatherMapItemTemp : WeatherMapItemWind = UIView.fromNib()

Зная, что mode имеет тип WeatherMapDisplayType

Как мне справиться с этим сценарием элегантным способом?

РЕДАКТИРОВАТЬ:

Я хочу иметь возможность сделать что-то вроде этого:

let markerView: WeatherMapItem = UIView.fromNib()
markerView.frame = CGRect(x: 0, y: 0, width: 80, height: 30)
markerView.setupWeatherInformations(mode: self.currentDisplayMode, forecast: forecasts)
marker.iconView = markerView

Ранее у меня был только тип WeatherMapItem.

Затем меня попросили добавить другой элемент карты погоды, поэтому у меня сейчас есть WeatherMapItemTemp и WeatherMapItemWind (также соответствующие моему перечислению).тип отображения).


func setupWeatherInformations(forecast: Forecast.HourlyForecast)

Это метод в моих пользовательских классах для настройки выходов.

Но у меня нет доступа к этому методу, если я инициализируюмой пользовательский вид из фрейма, потому что он имеет тип UIView.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Добавьте общий протокол к этим представлениям:

protocol WeatherMapItem where Self: UIView {
    func setupWeatherInformations()
}

class WeatherMapItemTemp: UIView, WeatherMapItem {
    func setupWeatherInformations() {
        // setup
    }
}

class WeatherMapItemWind: UIView, WeatherMapItem {
    func setupWeatherInformations() {
        // setup
    }
}

Добавьте вычисляемую переменную в перечисление:

enum WeatherMapDisplayType {
    case temperature
    case wind

    var view: (UIView & WeatherMapItem)? {
        var nibName: String? = nil
        switch self {
        case .temperature:
            nibName = "WeatherMapItemTemp"
        case .wind:
            nibName = "WeatherMapItemWind"
        }
        if let nibName = nibName, let views = Bundle.main.loadNibNamed(nibName, owner: nil), views.count > 0 {
            return views[0] as? UIView & WeatherMapItem
        }
        return nil
    }
}

Теперь вы можете сгенерировать представление следующим образом:

// assuming mode is the variable of type WeatherMapDisplayType
let view = mode.view
view?.setupWeatherInformations()
return view
0 голосов
/ 01 марта 2019

Обновленный ответ

Если вы хотите установить данные в этом единственном троичном выражении, объявите одну функцию в вашем классе пользовательского представления.Примерно так:

class WeatherMapItemTemp: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    public func setForecast(forecastData: Forecast) -> WeatherMapItemTemp {
        let view = WeatherMapItemTemp.init(frame: CGRect.init(x: 0, y: 0, width: 100, height: 100))

        //Set your appropriate value to your view objects
        return view
    }
}

Используйте это следующим образом

let markerView = mode == .temperature ? (WeatherMapItemTemp().setForecast(forecastData: YOUR_FORECAST_OBJ)) : (WeatherMapItemWind().setForecast(forecastData: YOUR_FORECAST_OBJ))

Обновление 2

Да, вам нужно загрузить это из пера

Обновите setForecast следующим образом.

class func setForecast(forecastData: Forecast) -> WeatherMapItemTemp {
        let view = UINib(nibName: "WeatherMapItemTemp", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! WeatherMapItemTemp

        //Do your further stuff here
        return view
    }
...