Tag: 扩展

从基类扩展委托

我有一个objc基类: @protocol BaseClassDelegate; @interface BaseClass : NSObject @property (nonatomic, weak) id <BaseClassDelegate> delegate; @end @protocol BaseClassDelegate <NSObject> -(void)baseDelegateMethod; @end 我正在创build一个快速的子类,我想扩展我的委托… protocol SubClassDelegate : BaseClassDelegate { func additionalSubClassDelegateMethod(); } class SubClass: BaseClass { @IBAction func onDoSomething(sender: AnyObject) { delegate?.additionalSubClassDelegateMethod(); <— No such method in 'delegate' } } 现在,当我创build我的子类,我可以说它符合SubClassDelegate并设置委托。 问题是(当然),这个子类中不存在“委托”。 有没有办法告诉编译器将我的委托“扩展”到我的子类中? (或者我在这里疯了,错过了一些明显的东西)

我如何扩展一个NSArray?

这是我的尝试: H文件: @interface Strings : NSArray @end M文件: @implementation Strings – (id) init { [self initWithObjects: @"One.", nil]; return self; } @end 当我运行我得到这个: 'NSInvalidArgumentException',reason:' * – [NSArray initWithObjects:count:]:只为抽象类定义的方法。 定义 – [stringinitWithObjects:count:]! 这是我所做的: H文件: @interface Strings : NSObject + (NSArray*) getStrings; @end M文件: @implementation Strings + (NSArray*) getStrings { NSArray* strings = [[NSArray alloc] initWithObjects: @"One.", […]

将CLPlacemark扩展为EXC BAD ACCESS

虽然在这里发现了一个类似的问题,但它并没有提供答案,至less不是针对一般问题。 我的问题是:由于CoreLocation地理编码速度有限,而且我正在开发应用程序的(web-)服务提供了自己的后备地址parsing服务,所以我想使用此自定义地理编码服务以防万一达到Apple的速率限制。 此外,我觉得避免自定义数据types对于由此自定义REST API返回的结果是CLPlacemark的,因此希望使用返回的数据来生成CLPlacemark 。 但是,文档指出CLPlacemark属性(如location, locality, administrativeArea等)是read-only 。 因此,我创build了一个CLPlacemark的子类,将需要的属性合成到我可以访问的私有variables上,即: // interface: (.h) @interface CustomPlacemark : CLPlacemark – (nonnull id)initWithLocation: (nonnull CLLocation *)location locality: (nullable NSString *)locality administrativeArea: (nullable NSString *)adminArea country: (nullable NSString *)country; @end // implementation (.m) @implementation CustomPlacemark @synthesize location = _location; @synthesize locality = _locality; @synthesize country = _country; @synthesize administrativeArea […]

如何在Swift中正确使用类扩展?

在Swift中,我一直使用扩展来扩展封闭types,并提供方便的,无逻辑的function,比如animation,math扩展等。但是,由于扩展是遍布整个代码库的硬依赖,所以在实现作为延伸的东西。 不过,最近我已经看到,苹果build议在更大程度上使用扩展,例如将协议作为单独的扩展来实现。 也就是说,如果你有一个实现协议B的类A,那么你最终得到这个devise: class A { // Initializers, stored properties etc. } extension A: B { // Protocol implementation } 当你进入这个兔子洞,我开始看到更多基于扩展的代码,例如: fileprivate extension A { // Private, calculated properties } fileprivate extension A { // Private functions } 我的一部分就像你在分开的扩展中实现协议时所获得的构build块。 它使得这个类的不同部分真正的不同。 但是,只要inheritance这个类,就不得不改变这个devise,因为扩展函数不能被覆盖。 我认为第二种方法是…有趣的。 有一件好事就是你不必注释每个私人财产和function作为私人,因为你可以指定的扩展。 然而,这种devise也分裂了存储和非存储的属性,公共和私人function,使得类的“逻辑”更难以遵循(我写小类)。 那和子类问题一起,让我在扩展仙境的门廊上停住了一点。 很想听听Swift社区如何看待扩展。 你怎么看? 有一个silverbullet?