Реализует NSCopying
я прочитала NSCopying
документы, но я все еще очень не уверен в том, как реализовать то, что требуется.
мой класс Vendor
:
@interface Vendor : NSObject
{
NSString *vendorID;
NSMutableArray *availableCars;
BOOL atAirport;
}
@property (nonatomic, copy) NSString *vendorID;
@property (nonatomic, retain) NSMutableArray *availableCars;
@property (nonatomic, assign) BOOL atAirport;
- (id)initFromVehVendorAvailsDictionary:(NSDictionary *)vehVendorAvails;
@end
The Vendor
класс имеет массив объектов с именем Car
.
мой
3 ответа:
для реализации NSCopying, ваш объект должен отвечать
-copyWithZone:
селектор. Вот как вы заявляете, что вы ему соответствуете:@interface MyObject : NSObject <NSCopying> {
тогда, в реализации вашего объекта (ваш
.m
file):- (id)copyWithZone:(NSZone *)zone { // Copying code here. }
что должен делать ваш код? Во-первых, создайте новый экземпляр объекта-вы можете вызвать
[[[self class] alloc] init]
чтобы получить инициализированный obejct текущего класса, который хорошо работает для подклассов. Тогда для любых переменных экземпляра, которые являются подклассом изNSObject
что поддерживает копирование, вы можете позвонить[thatObject copyWithZone:zone]
для нового объекта. Для примитивных типов (int
,char
,BOOL
и друзья) просто установите переменные равными. Итак, для вашего поставщика obejct это будет выглядеть так:- (id)copyWithZone:(NSZone *)zone { id copy = [[[self class] alloc] init]; if (copy) { // Copy NSObject subclasses [copy setVendorID:[[self.vendorID copyWithZone:zone] autorelease]]; [copy setAvailableCars:[[self.availableCars copyWithZone:zone] autorelease]]; // Set primitives [copy setAtAirport:self.atAirport]; } return copy; }
этот ответ похож на принятый, но использует
allocWithZone:
и обновляется для дуги. NSZone-это базовый класс для выделения памяти. При этом игнорируяNSZone
может работать в большинстве случаев, это все же неправильно.правильно реализовать
NSCopying
необходимо реализовать метод протокола, который выделяет новую копию объекта со свойствами, соответствующими значениям оригинала.в объявлении интерфейса в заголовке укажите, что ваш класс реализует
NSCopying
протокол:@interface Car : NSObject<NSCopying> { ... }
в рамках .м реализации добавить
-(id)copyWithZone
метод, который выглядит примерно следующим образом:- (id)copyWithZone:(NSZone*)zone { Car* carCopy = [[[self class] allocWithZone:zone] init]; if (carCopy) { carCopy.isAvailable = _isAvailable; carCopy.transmissionType = _transmissionType; ... // assign all other properties. } return carCopy; }
Swift Версия
просто позвони
object.copy()
создать копию.Я не использую
copy()
для типов значений, так как они скопированы "автоматически.- Но я должен был использоватьcopy()
наclass
типы.я проигнорировал .copy()}) as? [Car] { copy.availableCars = availableCarsCopy } return copy } } class Car { let transmissionType: String var isAvailable: Bool = false var fees: [Double] = [] init(transmissionType: String) { self.transmissionType = transmissionType } } extension Car: NSCopying { func copy(with zone: NSZone? = nil) -> Any { let copy = Car(transmissionType: transmissionType) copy.isAvailable = isAvailable copy.fees = fees return copy } }