Swift 4 无法转换“[String : AnyObject]”类型的值?到预期的参数类型 '[NSAttributedStringKey : Any]?'
Swift 4 Cannot convert value of type '[String : AnyObject]?' to expected argument type '[NSAttributedStringKey : Any]?'
我刚刚更新到 Xcode 9 并将我的应用程序从 swift 3 转换为 swift 4。
我有使用字符串来标记轴和其他变量的图表。
所以我有一个 moneyAxisString = "Money"。
以前我可以使用以下代码绘制它们:
moneyAxisString.draw(in: CGRect(x: CGFloat(coordinateXOriginLT + axisLength/3), y: CGFloat(coordinateYOriginRT + axisLength + 5 * unitDim), width: CGFloat(300 * unitDim), height: CGFloat(100 * unitDim)), withAttributes: attributes as? [String : AnyObject])
其中attributes是一个字典,定义如下
attributes = [
NSAttributedStringKey.foregroundColor: fieldColor,
NSAttributedStringKey.font: fieldFont!,
NSAttributedStringKey.paragraphStyle: style
]
现在我的应用无法编译,我收到消息:
无法转换“[String : AnyObject]”类型的值?到预期的参数类型 '[NSAttributedStringKey : Any]?'
这是类型不匹配:[String : AnyObject]
显然不是[NSAttributedStringKey : Any]
⌥-单击 在 NSAttributedStringKey
上查看声明。
解决方案是将 attributes
声明为
var attributes = [NSAttributedStringKey : Any]()
删除向下转换
..., withAttributes: attributes)
简单写
attributes = [.foregroundColor: fieldColor,
.font: fieldFont!,
.paragraphStyle: style]
试试这个:
class func getCustomStringStyle() -> [NSAttributedStringKey: Any]
{
return [
NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont.systemFont(ofSize: 16), // or your fieldFont
NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.black, // or your fieldColor
NSAttributedStringKey(rawValue: NSAttributedStringKey.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
]
}
或:
class func getCustomStringStyle() -> [String: Any]
{
return [
NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 16),
NSAttributedStringKey.foregroundColor.rawValue: UIColor.black,
NSAttributedStringKey.paragraphStyle.rawValue:NSParagraphStyle.default
]
}
NSAttributedStringKey
已更改为 Swift 4 中的结构。但是, 使用 NSAttributedStringKey
的其他对象显然没有得到更新同时
最简单的修复,无需更改任何其他代码,就是 append .rawValue
到 all 你出现的 NSAttributedStringKey
setter - 将键名变成 String
s:
let attributes = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
] as [String : Any]
请注意,您现在也不需要 as
处的 !
。
或者,您可以通过将数组预先声明为 [String : Any]
来跳过末尾的 as
转换:
let attributes: [String : Any] = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]
当然,您仍然需要为您设置的每个 NSAttributedStringKey
项附加 .rawValue
。
Swift 4.2
基于 user_Dennis
的示例
func getCustomStringStyle() -> [NSAttributedString.Key: Any]
{
return [
NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): UIFont.systemFont(ofSize: 25), // or your fieldFont
NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.black, // or your fieldColor
NSAttributedString.Key(rawValue: NSAttributedString.Key.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
]
}
我刚刚更新到 Xcode 9 并将我的应用程序从 swift 3 转换为 swift 4。 我有使用字符串来标记轴和其他变量的图表。 所以我有一个 moneyAxisString = "Money"。 以前我可以使用以下代码绘制它们:
moneyAxisString.draw(in: CGRect(x: CGFloat(coordinateXOriginLT + axisLength/3), y: CGFloat(coordinateYOriginRT + axisLength + 5 * unitDim), width: CGFloat(300 * unitDim), height: CGFloat(100 * unitDim)), withAttributes: attributes as? [String : AnyObject])
其中attributes是一个字典,定义如下
attributes = [
NSAttributedStringKey.foregroundColor: fieldColor,
NSAttributedStringKey.font: fieldFont!,
NSAttributedStringKey.paragraphStyle: style
]
现在我的应用无法编译,我收到消息:
无法转换“[String : AnyObject]”类型的值?到预期的参数类型 '[NSAttributedStringKey : Any]?'
这是类型不匹配:[String : AnyObject]
显然不是[NSAttributedStringKey : Any]
⌥-单击 在 NSAttributedStringKey
上查看声明。
解决方案是将 attributes
声明为
var attributes = [NSAttributedStringKey : Any]()
删除向下转换
..., withAttributes: attributes)
简单写
attributes = [.foregroundColor: fieldColor,
.font: fieldFont!,
.paragraphStyle: style]
试试这个:
class func getCustomStringStyle() -> [NSAttributedStringKey: Any]
{
return [
NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont.systemFont(ofSize: 16), // or your fieldFont
NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.black, // or your fieldColor
NSAttributedStringKey(rawValue: NSAttributedStringKey.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
]
}
或:
class func getCustomStringStyle() -> [String: Any]
{
return [
NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 16),
NSAttributedStringKey.foregroundColor.rawValue: UIColor.black,
NSAttributedStringKey.paragraphStyle.rawValue:NSParagraphStyle.default
]
}
NSAttributedStringKey
已更改为 Swift 4 中的结构。但是, 使用 NSAttributedStringKey
的其他对象显然没有得到更新同时
最简单的修复,无需更改任何其他代码,就是 append .rawValue
到 all 你出现的 NSAttributedStringKey
setter - 将键名变成 String
s:
let attributes = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
] as [String : Any]
请注意,您现在也不需要 as
处的 !
。
或者,您可以通过将数组预先声明为 [String : Any]
来跳过末尾的 as
转换:
let attributes: [String : Any] = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]
当然,您仍然需要为您设置的每个 NSAttributedStringKey
项附加 .rawValue
。
Swift 4.2
基于 user_Dennis
func getCustomStringStyle() -> [NSAttributedString.Key: Any]
{
return [
NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): UIFont.systemFont(ofSize: 25), // or your fieldFont
NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.black, // or your fieldColor
NSAttributedString.Key(rawValue: NSAttributedString.Key.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
]
}