将相同类别添加到多个类

And*_*rew 20 cocoa cocoa-touch objective-c ios objective-c-category

我有一个Objective-C类别,我想在不重复类别中包含的代码的情况下添加到多个类中.我只想将相同的方法添加到多个类中.

我对现有类NSManagedObject的子类(Book,Chapter,Page),我想在所有这些子类的清洁和维护的方式添加常用功能.

一种方法是给类添加到他们的共同的超(NSManagedObject),但有增加类别的方法,所有的结果NSManagedObject子的时候我想的方法添加三个NSManagedObject子类(Book,Chapter,Page).

另一种解决办法是子类NSManagedObject,然后有Book,ChapterPage来自继承NSManagedObject的子类.这是最干净,最直接的方法.这种方法的一大缺点是当数据模型发生变化并且Xcode重新生成子类时,它会将它们重置为继承NSManagedObject而不是继承SubclassedManagedObject.如果可能的话,我想避免使用像mogenerator/Xmo这样的东西.

是否可以在多个类上添加单个类别而无需重复代码?

谢谢.

小智 5

也许为时已晚..但是也许有一种方法可以做到..但是,您说..需要具有相同的超类

Category.h

@protocol MyProtocol <NSObject>
- (NSString*)foo;
@end

@interface NSArray  (category) <MyProtocol> @end
@interface NSString (category) <MyProtocol> @end
Run Code Online (Sandbox Code Playgroud)

类别.m

@interface NSObject (category) <MyProtocol> @end
@implementation NSObject (category)
- (NSString*)foo
{
    return @"bar";
}
@end
Run Code Online (Sandbox Code Playgroud)

我也不喜欢这样,但是可以用


And*_*rew 1

我仍然不知道在 Objective-C 中执行此操作的干净方法,但在 Swift 2.0 中,可以通过向现有协议添加函数和/或属性来使用协议扩展来实现此目的。然后,该协议可以被任意数量的类、结构和/或枚举采用。

protocol Numbered {
    func number() -> Int
}

extension Numbered {
    func number() -> Int {
        return Int(arc4random()) % 10
    }
}

class Book : Numbered {

}

class Chapter : Numbered {

}

class Page : Numbered {

}

let myBook = Book()
let myChapter = Chapter()
let myPage = Page()

print("myBook.number() = \(myBook.number())")
print("myChapter.number() = \(myChapter.number())")
print("myPage.number() = \(myPage.number())")
Run Code Online (Sandbox Code Playgroud)

number()在所有三个类 ( Book, Chapter, ) 上正确实现Page

myBook.number() = 5
myChapter.number() = 2
myPage.number() = 8
Run Code Online (Sandbox Code Playgroud)