- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 switch case 来匹配泛型类型,但我不确定如何匹配 ImplicitlyUnwrappedOptional
的。
想象一下这个功能:
enum AttributeName: String {
case someFloat = "someFloat"
case someTint = "SomeTint"
}
func defaultValue<T>(_ name: AttributeName) -> T {
switch name {
case .someFloat:
return CGFloat(8.0) as! T
case .someTint:
return UIColor.blue as! T
}
}
func attribute<T>(_ name: AttributeName) -> T? {
let attributes: [AttributeName: Any] = [AttributeName.someFloat: 10.0,
AttributeName.someTint: UIColor.red]
switch T.self {
case is CGFloat.Type:
guard let aFloat = attributes[name] as? Float
else { return nil }
return CGFloat(aFloat) as? T
case is CGColor.Type:
guard let color = attributes[name] as? UIColor
else { return nil }
return color as? T
default:
guard let attribute = attributes[name] as? T
else { return nil }
return attribute
}
}
let button = UIButton()
button.layer.cornerRadius = attribute(AttributeName.someFloat) ?? defaultValue(AttributeName.someFloat)
button.backgroundColor = attribute(AttributeName.someTint) ?? defaultValue(AttributeName.someTint)
button.tintColor = attribute(AttributeName.someTint)
如果您尝试调用以上内容,则效果很好:
let button = UIButton()
button.layer.cornerRadius = attribute("float") // will be 10.0
button.backgroundColor = attribute("tint") // will be red
但尝试分配按钮的 tintColor
将返回 nil
因为 T
的类型将是 ImplicitlyUnwrappedOptional<UIColor>
。即:
button.tintColor = attribute("tint") // will be nil
我想我知道 ImplicitlyUnwrappedOptional 是什么以及 Apple 为什么使用它们 ( by reading this question )。但我该如何匹配tintColor
在这种情况下?
我可以这样做:let tint: UIColor = attribute("tint")
并分配 tint
到按钮的 tintColor
。但正在手动创建UIColor
并将其分配给 tintColor
真的是唯一的方法吗?
最佳答案
如何使用更好的类型来表示您的数据,从而回避您的问题?也许是这样的:
struct ButtonStyle {
// If some of these proprties need to be optional (i.e. they're not always
// set as part of a style) then comment below and I'll modify this accordingly
cornerRadius: CGFloat
backgroundColor: UIColor
init(cornerRadius: CGFloat, backgroundColor: UIColor) {
self.cornerRadius = cornerRadius
self.backgroundColor = backgroundColor
}
// If you need to initialize ButtonStyle objects from dictionaries
// (e.g. from JSON), you can use this.
// However, using `Codable` instead is ***greatly*** preferred.
init?(fromDict dict: [String: Any] {
guard let cornerRadius = dict["float"] as? CGFloat,
let backgroundColor = dict["color"] as? UIColor {
return nil
}
self.init(cornerRadius: cornerRadius, backgroundColor: backgroundColor)
}
}
extension UIButton {
var style: ButtonStyle {
get {
ButtonStyle(cornerRadius: self.layer.cornerRadius,
backgroundColor: self.backgroundColor)
}
set {
self.layer.cornerRadius = newValue.cornerRadius
self.backgroundColor = newValue.backgroundColor
}
}
}
let buttonStyle = ButtonStyle(cornerRadius: 10, backgroundColor: UIColor.red)
let button = UIButton()
button.style = buttonStyle
关于swift - 在 switch 语句中匹配 ImplicitlyUnwrappedOptional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47634601/
我正在尝试使用 switch case 来匹配泛型类型,但我不确定如何匹配 ImplicitlyUnwrappedOptional的。 想象一下这个功能: enum AttributeName: St
我想了解为什么在执行 params["bar"] = str 时没有得到 ImplicitlyUnwrappedOptional 但在声明 时却得到了它params 具有相同的强制展开变量。 请看下面
从 Xcode 9.3 开始,我在我的模型中使用“Swift.ImplicitlyUnwrappedOptional.some”包裹了我的字符串变量 我不知道这是怎么发生的,但它毁了我的应用程序! 我
我正在配置午睡的 ResponseTransformer 以返回对象数组。 service.configureTransformer("/models/*") { Model.
我是一名优秀的程序员,十分优秀!