您无法(UI)Font
直接保存到用户默认值,因为它不符合属性列表.
一个合适的解决方案是分别保存字体的String
名称和Float
大小.这可以通过以下扩展来实现UserDefaults
:
extension UserDefaults { func set(font : UIFont, forKey key : String) { let fontName = font.fontName let fontSize = font.pointSize self.set(fontName, forKey: key + "_name") self.set(Float(fontSize), forKey: key + "_size") } func font(forKey key : String) -> UIFont? { guard let fontName = string(forKey: key + "_name") else { return nil } let fontSize = float(forKey: key + "_size") if fontSize == 0.0 { return nil } return UIFont(name: fontName, size: CGFloat(fontSize)) } }
或者 - 也可以使用扩展名 - 归档并取消归档字体NSData
:
extension UserDefaults { func set(font: UIFont, forKey key: String) { let data = NSKeyedArchiver.archivedData(withRootObject: font) self.set(data, forKey: key) } func font(forKey key: String) -> UIFont? { guard let data = data(forKey: key) else { return nil } return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIFont } }