如何覆盖Swift中的Objective-cclass函数?

How to override Objective-c class functions in Swift?

我目前正在尝试将 UIFont 的 systemFontOfSize 方法覆盖为 return 我的具有给定字体大小的自定义字体。我的代码目前看起来像这样:

extension UIFont
{
    class func systemFontOfSize(fontSize: CGFloat) -> UIFont
    {
        return UIFont(name: "HelveticaNeue", size: 10)!
    }
}

但是,我无法覆盖该方法。使用上面显示的代码时,出现以下错误:

"Method 'systemFontOfSize' with Objective-C selector 'systemFontOfSize:' conflicts with previous declaration with the same Objective-C selector"

添加覆盖时,错误是方法没有覆盖任何东西。 有谁知道如何解决这个问题?

为了能够覆盖该函数,您必须首先子类化 UIFont。你想做什么,是不可能的。您正在尝试重新定义扩展中的功能。所以,我没有任何积极的信息,但这就是现实。

PS:如果您是 Objective C 'expert',可以使用一些 hack ...

class FontClass: UIFont{ override class func systemFontOfSize(fontSize: CGFloat) -> UIFont { return UIFont(name: "HelveticaNeue", size: 10)! } } 在项目中,你可以这样使用它: FontClass.systemFontOfSize(10) 希望能帮到你!

来自 Apple's documentation 的扩展:

NOTE

Extensions can add new functionality to a type, but they cannot override existing functionality.

您不能覆盖扩展中的现有方法,只能添加新方法。

如果符合您的需要,您可以按如下方式使用 Objective C 扩展程序。

可以在此处找到与此技术相关的早期讨论以及我的源代码作为答案:Is there a way to change default font for your application

您所要做的就是使用上面 link 中提到的代码实现 class 并在您的保护伞 header 中包含以下 header 文件以能够在 Swift 代码中调用方法时应用代码。

Header 文件 UIFont+Utils.h:

@interface UIFont (Utils)

+ (UIFont *)systemFontOfSize:(CGFloat)size;
+ (UIFont *)lightSystemFontOfSize:(CGFloat)size;
+ (UIFont *)boldSystemFontOfSize:(CGFloat)size;
+ (UIFont *)preferredFontForTextStyle:(NSString *)style;

@end

您可以使用 #selectorUIFont 调用重定向到自定义函数。

有关如何为整个 iOS 应用程序替换字体功能的最佳方法,请检查以下 SO 问题,从 - Javier Amor Penas 寻找答案:

Set a default font for whole iOS app?