如何根据三元表达式声明变量类型?

How to declare a variable type depending on a ternary expression?

我有这个枚举:

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 类型。

然后我被要求添加另一个天气图项目,这就是为什么我现在有 WeatherMapItemTempWeatherMapItemWind(也对应于我的枚举显示类型)。


func setupWeatherInformations(forecast: Forecast.HourlyForecast)

这是我自定义的方法类,用于配置插座。

但是如果我从框架初始化我的自定义视图,我将无法访问此方法,因为它是 UIView 类型。

更新答案

如果您想在单个三元语句中设置数据,请在您的自定义视图中声明一个函数 class。 像关注

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
    }

为这些视图添加通用协议:

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