موضوع الفئة الهدف-C
-
25-09-2019 - |
سؤال
لقد قمت بإنشاء فرز مخصص عن طريق إنشاء فئة جديدة لـ NSString
صف دراسي. أدناه هو الكود الخاص بي.
@implementation NSString (Support)
- (NSComparisonResult)sortByPoint:(NSString *)otherString {
int first = [self calculateWordValue:self];
int second = [self calculateWordValue:otherString];
if (first > second) {
return NSOrderedAscending;
}
else if (first < second) {
return NSOrderedDescending;
}
return NSOrderedSame;
}
- (int)calculateWordValue:(NSString *)word {
int totalValue = 0;
NSString *pointPath = [[NSBundle mainBundle] pathForResource:@"pointvalues"ofType:@"plist"];
NSDictionary *pointDictionary = [[NSDictionary alloc] initWithContentsOfFile:pointPath];
for (int index = 0; index < [word length]; index++) {
char currentChar = [word characterAtIndex:index];
NSString *individual = [[NSString alloc] initWithFormat:@"%c",currentChar];
individual = [individual uppercaseString];
NSArray *numbersForKey = [pointDictionary objectForKey:individual];
NSNumber *num = [numbersForKey objectAtIndex:0];
totalValue += [num intValue];
// cleanup
individual = nil;
numbersForKey = nil;
num = nil;
}
return totalValue;
}
@end
سؤالي هو ما إذا كنت أقوم بإنشاء قاموس نقطة لتحديد قيمة النقطة المرتبطة بكل حرف في الأبجدية استنادًا إلى PLIST. ثم في وحدة التحكم الخاصة بي ، أتصل
NSArray *sorted = [words sortedArrayUsingSelector:@selector(sortByPoint:)];
لفرز جدول الكلمات الخاص بي من خلال قيم نقاطهم. ومع ذلك ، إنشاء قاموس جديد في كل مرة -sortByPoint:
الطريقة تسمى غير فعالة للغاية. هل هناك طريقة لإنشاء النقطة مسبقًا واستخدامها لكل مكالمة لاحقة في -calculateWordValue:
?
المحلول
هذه مهمة للكلمة الرئيسية الثابتة. إذا قمت بذلك:
static NSDictionary *pointDictionary = nil
if (pointDictionary==nil) {
NSString *pointPath = [[NSBundle mainBundle] pathForResource:@"pointvalues" ofType:@"plist"];
pointDictionary = [[NSDictionary alloc] initWithContentsOfFile:pointPath];
}
pointDictionary
سيكون ثابتًا لعمر تطبيقك.
أحد التحسينات الأخرى هو بناء مخبأ من الدرجات باستخدام هذا مقابل كل من كلماتك:
[dict setObject:[NSNumber numberWithInt:[word calculateWordValue:word]] forKey:word];
ثم استخدم keysSortedByValueUsingSelector:
طريقة لاستخراج قائمة الكلمات الخاصة بك (لاحظ أن المحدد يمكن المقارنة: ، لأن الكائنات التي تتم مقارنتها هي nsnumbers).
أخيرًا ، تكون الوسيطة على طريقتك زائدة عن الحاجة. استخدم الذات بدلاً من ذلك:
-(int)calculateWordValue {
...
for (int index = 0; index < [self length]; index++)
{
char currentChar = [self characterAtIndex:index];
...
}
...
}
نصائح أخرى
تغيير الخاص بك sortByPoint:(NSString *) otherString
طريقة لاتخاذ القاموس كمعلمة ، وقم بتمرير القاموس الذي تم إنشاؤه مسبقًا.
sortByPoint:(NSString *)otherString withDictionary:(NSDictionary *)pointDictionary
تحرير: لن تعمل بسبب الاستخدام في sortedarraywithselector. اعتذارات. بدلاً من ذلك ، قد تكون أفضل حالًا في إنشاء فئة Wrapper لقاموس Point الخاص بك باعتباره Singleton الذي تحصل عليه بعد ذلك مرجعًا إلى كل مرة تعمل فيها وظيفة الفرز.
في calculateWordValue
:
NSDictionary *pointDictionary = [[DictWrapper sharedInstance] dictionary];
DictWrapper
لديه NSDictionary كقرة وطريقة الفصل sharedInstance
(لإرجاع المفرد. عليك أن تضع هذا القاموس وإضفاء الطابع المسبق عليه قبل أن تقوم أولاً بالفرز.