如何在Swift中覆盖Objective-c类函数?

时间:2016-01-04 09:40:55

标签: objective-c swift fonts override uifont

我正在尝试覆盖UIFont的systemFontOfSize方法,以返回给定字体大小的自定义字体。我的代码目前看起来像这样:

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"

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

5 个答案:

答案 0 :(得分:1)

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

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

您所要做的就是使用上面链接中提到的代码实现该类,并在您的伞标题中包含以下头文件,以便能够在Swift代码中调用方法时应用代码。

标题文件UIFont+Utils.h

@interface UIFont (Utils)

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

@end

答案 1 :(得分:1)

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

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

Set a default font for whole iOS app? < p>

答案 2 :(得分:0)

要能够覆盖该函数,必须首先继承UIFont。你想做什么,是不可能的。你试图在扩展中重新定义功能。所以,我没有积极的信息,但这就是现实。

PS:如果您是目标C&#39;专家&#39;,可以使用某些黑客......

答案 3 :(得分:0)

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

答案 4 :(得分:0)

来自Apple's documentation的扩展程序:

  

请注意

     

扩展程序可以为类型添加新功能,但它们无法覆盖现有功能。

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