0

我正在尝试创建一个不可变的类。无需再费周折:

#import "MatrixRow2.h"

@implementation MatrixRow2

@synthesize rows;

-(MatrixRow2*) initWithFractionNumberArray:(NSArray*)array
{
    if (self = [super init]) {
        rows = array;
    }

    return self;
}

-(MatrixRow2*) rowByMultiplyingByFractionNumber:(FractionNumber*)number
{
    NSArray *temp = rows.copy;
    MatrixRow2 *newRow = [[MatrixRow2 alloc] initWithFractionNumberArray:temp];

    for (int i=0; i < newRow.rows.count; i++) {
        [[newRow.rows objectAtIndex:i] multiplyByFraction:number];
    }

    return newRow;
}

-(NSString*) description
{
    return [rows description];
}

@end

和测试仪代码:

MatrixRow2 *r = [[MatrixRow2 alloc] initWithFractionNumberArray:tempRow];

NSLog(@"Initial row values: %@", r);

FractionNumber *randomMultiplier = [FractionNumber fractionFromRandomFractionWithMaxNumerator:100 maxDenominator:99 integerChanceIn10:8];

MatrixRow2 *r2= [r rowByMultiplyingByFractionNumber:randomMultiplier];

NSLog(@"%@ * %@ = %@", r, randomMultiplier, r2);

输出是:

2012-04-20 22:33:29.081 RREF[3586:f803] Initial row values: (
    70,
    94,
    98,
    90
)
2012-04-20 22:33:29.083 RREF[3586:f803] (
    770,
    1034,
    1078,
    990
) * 11 = (
    770,
    1034,
    1078,
    990
)

在第二个输出行中,r 的值已更改为相乘后的值。它应该是:

[70 94 98, 90] * 11 = [770 1034 1078 990]
4

1 回答 1

2

你正在做一个数组的浅拷贝。您需要先复制数组中的每个项目,然后再对其进行变异。

这将涉及创建每个项目的副本并将其添加到新数组(或使用每个项目的副本更新复制数组中的项目)。

与不可变对象一起使用的所有内容都需要在变异之前是不可变的或复制的。

于 2012-04-21T02:47:22.370 回答