Реализует 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 78

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 } }