如何覆盖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
您可以使用 #selector
将 UIFont
调用重定向到自定义函数。
有关如何为整个 iOS 应用程序替换字体功能的最佳方法,请检查以下 SO 问题,从 - Javier Amor Penas 寻找答案:Set a default font for whole iOS app?
我目前正在尝试将 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
您可以使用 #selector
将 UIFont
调用重定向到自定义函数。