在目标C中使用泛型实现UIView扩展功能

问题描述

我正在尝试将一些快速函数转换为Objective-C

extension UIView {
    class func fromNib<T: UIView>() -> T {
        return Bundle(for: T.self).loadNibNamed(String(describing: T.self),owner: nil,options: nil)![0] as! T
    }
}

这是来自Load a UIView from nib in Swift

代码

我认为.h文件可以这样写

@interface UIView <T: UIView *> (MyCommon)
+ (T) loadFromNib;
@end

我有这样的错误

非参数化类'UIView'的类别不能具有类型参数

这是否意味着不可能在目标C中使用Generic来实现UIView扩展功能

解决方法

我提到的答案使用NSObject类别。也许将其更改为UIView类别,如下所示。

编辑

由于您希望MyView看到下面的更改,然后尝试一下。请注意,在Objective-C中,您会收到一条警告,而Swift会为这种代码拍打您的手...

@class MyView;

@interface UIView (loadFromNib)

@end

@implementation UIView (LoadFromNib)

// This only returns UIView or subclass ... or nil
+ ( UIView * )loadFromNib:( NSString * ) name
{
    // For the adventurous
    return [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil].firstObject;

    // For the cautious
    for ( NSObject * i in [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil] )
    {
        if ( [i isKindOfClass:UIView.class] )
        {
            return i;
        }
    }

    // For the unsuccessful
    return nil;
}

// This returns MyView
+ ( MyView * ) loadMyViewFromNib:( NSString * ) name
{
    return [UIView loadFromNib:name];
}

@end