'UIFont'无法转换为'UIFont?'

41

今天晚上我更新了XCode到7.3。

在我的一个项目中,我为一些标签设置字体时会出现以下错误:

'(name: String, size: CGFloat) -> UIFont' is not convertible to '(name: String, size: CGFloat) -> UIFont?'

编辑: 这是我在导航栏中用于标题视图的代码:

let aTitleFrame: CGRect = CGRectMake(0, aHeaderTitleSubtitleView.frame.midY / 2, 200, 24)
let aTitleView: UILabel = UILabel(frame: aTitleFrame)
aTitleView.backgroundColor = UIColor.clearColor()
aTitleView.font = UIFont(name: "Roboto-Regular", size: 15) // ERROR POPS UP HERE
aTitleView.textAlignment = NSTextAlignment.Center
aTitleView.textColor = UIColor.whiteColor()

这是我为一个UILabel编写的Attributed String代码:

let aAttributedFundLabel: NSMutableAttributedString = NSMutableAttributedString(string: "Raising\n$ \(fund)")
aAttributedFundLabel.addAttribute(NSForegroundColorAttributeName, value: UIColor.darkGrayColor(), range: NSRange(location: 0, length: 7))
aAttributedFundLabel.addAttribute(NSFontAttributeName, value: UIFont(name: "Roboto-Regular", size: 15)!, range: NSRange(location: 0, length: 7)) // ERROR POPS UP HERE 
aAttributedFundLabel.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSRange(location: 8, length: fund.characters.count + 2))
aAttributedFundLabel.addAttribute(NSFontAttributeName, value: UIFont(name: "Roboto-Regular", size: 16)!, range: NSRange(location: 8, length: fund.characters.count + 2)) // ERROR POPS UP HERE
startupFund.attributedText = aAttributedFundLabel

这种情况只发生在我的整个项目中的两个文件中。

我打开了另一个项目,但是即使我在那里也为多个标签设置了字体,但我仍然能够成功构建和运行它,没有任何错误。

有任何想法为什么会发生这种情况吗?

谢谢!


2
如果您能展示实际的代码,那将会很有帮助。 - matt
编辑了带有实际代码的问题。 - Vishal
很酷,感谢你这样做。 - matt
1
无法重现问题。请复制/粘贴原始代码并指出错误所在的行。 - Eiko
1
你把一个字符串命名为 aAttributedFundLabel?阿达·洛夫莱斯的幽灵会惩罚你的... - vikingosegundo
显示剩余12条评论
3个回答

116

在Stack Overflow的其他地方,有人建议你在这种情况下使用以下代码:

aTitleView.font = UIFont(name: "Roboto-Regular", size: 15)

你应该尝试写出这个:

aTitleView.font = UIFont.init(name: "Roboto-Regular", size: 15)

我无法为此负责(因为我无法重现这个错误),所以我只是猜测!但是知道它是否实际起作用会非常有趣。


哇,太棒了。最让我惊讶的是,我却无法复制这个问题!我很想亲身体验这个问题。如果可能的话,请一定向苹果提交一个有复现步骤的Bug报告。 - matt
3
我遇到了同样的问题,我将它设置在“lazy var实例化”内部;如果在外部进行,就不需要初始化。 - Arnaud
哈,这一个有点奇怪,我看到 Xcode 团队发布了一个雷达...... 想象一下 - zumzum
哦,别这样!如果每个对象都没有使用.init进行初始化,那为什么要这样呢? - Mohammad Zaid Pathan
1
只是为了增加混乱,我的应用程序的构建目标一直在工作,但当我去归档它以发布时...我遇到了这个问题。添加.init(解决了它。 - cleverbit
显示剩余11条评论

9

我也遇到了这个问题。对我有效的解决方法是关闭整模块优化。

构建设置 > Swift 编译器 - 代码生成 > 优化级别

我将其设置为最快 (整模块优化)。当我将其设置为无时,我不再有这个问题。为了背景,这是一个混合的代码库,包含Objective-C和Swift。


4
同样的情况。只有在归档项目时才会出现这个错误。以调试模式构建和运行没有错误。因此,我查看了我的调试/发布优化并测试了Fast(WMO) vs. Fast[-O]。那样做解决了问题,但是因为性能原因,我希望保留WMO,所以我暂时将使用 UIFont.init(name: - slider
UIFont.init 对我也不起作用,必须将其转换为单文件优化,诅咒旧代码。 - Tj3n
有没有选项可以同时使用Fast(WMO)和UIFont()? - Asif Bilal
Xcode太烂了,即使禁用优化,它仍然会出现问题。在我开始使用Xcode编码之前,我“钦佩”苹果,但我知道很多非常不同的平台。 - Jaime Agudo

1

我遇到了同样的问题,采取以下步骤使我能够再次编译:

let descriptor = UIFontDescriptor(name: "OpenSans-Semibold", size: 10.0)
label.font = UIFont(descriptor: descriptor, size: 10.0)

所以,使用UIFontDescriptor ...

对我来说,这样做也有效:

if let font = UIFont(name: "OpenSans-Semibold", size: 10) {
    label.font = font
}

谢谢您的回复,zumzum! :) - Vishal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接