【问题标题】:Why is the font optional?为什么字体是可选的?
【发布时间】:2017-03-20 13:12:24
【问题描述】:

我创建了一个结构,让我的字体在全球范围内预缓存:

struct Fonts {
    static let avenirRegular = UIFont(name: "AvenirNextCondensed-Regular", size: 14.0)
}

用法...:

xy.font = Fonts.avenirRegular

它告诉我,我的常量是可选的。

可选类型“UIFont?”的值未拆封;你的意思是用'!'还是“?”?

为什么它是可选的? AvenirNextCondensed-Regular 是否有可能并非在所有 iOS 设备上都可用?非常感谢您的帮助。

【问题讨论】:

  • 名称是任意字符串,所以UIFont(name: "!§%&()????wot???", size: 399)一定有机会返回nil
  • 如果您知道,即使在 Objective-C 中,如果您发送任意字符串作为字体名称,UIFont 的 init 方法也可以返回 null。在objective-c中,虽然初始化器是可为空的初始化器,这意味着你要么得到一个UIFont,要么返回null。为了表示这些可为空的初始化器(在 swift 中为 nilable),我们使用可选的返回类型,表示该方法可以返回某种类型的对象,否则它将返回 nil。

标签: ios swift uifont


【解决方案1】:

您用于UIFont 的初始化程序是返回可选UIFont? 对象,即您收到包装可选的建议的原因。

init?(name fontName: String, size fontSize: CGFloat)

查看Apple DocumentationUIFont 了解更多详情。

【讨论】:

    【解决方案2】:

    这里的“可选”意味着问题是字体可能不存在(即使我们知道它确实存在)并且您必须识别它,通过使其可选,您告诉编译器我知道字体不是一部分你的图书馆,但我确定它在那里。

    【讨论】:

    • 如果存在具有该名称的字体,它仍将返回UIFont?,因为初始化程序 OP 正在使用 return Optional UIFont 对象。
    • @NiravD 绝对:)
    • 谢谢你的回答伙伴。即使您的答案获得最多的赞成票(我一直在等着看哪个会),我还是选择检查另一个答案。你的解释很好,但它可能不是“最好”或最“正确”的解释。你说,字体不是可选的。但正如@NiravD 提到的,我收到了UIFont?,所以返回的值确实是可选的。
    • 无论你的船是什么
    【解决方案3】:

    只需使用强制解包来防止这种情况:

    struct Fonts {
        static let avenirRegular = UIFont(name: "AvenirNextCondensed-Regular", size: 14.0)!
    }
    

    【讨论】:

    • 感谢您的想法。但这并不能回答问题。我知道我得到了什么以及如何解决它。问题是,为什么我得到它。但它可能对更多的观众有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2019-06-07
    相关资源
    最近更新 更多