问题描述
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