#ios #objective-c #casting
#iOS #objective-c #Кастинг
Вопрос:
Я быстрый разработчик, не имеющий знаний в objective c. Может ли кто-нибудь помочь мне с преобразованием приведенного ниже кода в Objective C
let newVersion = Int((userInfo.value(forKey:
"gcm.notification.version") as string).replacingOccurrences(of: ".", with: ""))
let currentVersion = Int((userDefaults.standard.value(forKey: "currentAppVersion") as string).replacingOccurrences(of: ".", with: ""))
if(newVersion > currentVersion) {
//code here
}
Ответ №1:
NSString *newVersion = [(NSString *)[notification.userInfo valueForKey:@"gcm.notification.version"] stringByReplacingOccurrencesOfString:@"." withString:@""];
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
NSString *oldVersion = [(NSString *)[standardDefaults valueForKey:@"currentAppVersion"] stringByReplacingOccurrencesOfString:@"." withString:@""];
if ([newVersion integerValue] > [oldVersion integerValue]){
//code here
}
Комментарии:
1. @Ravi Это не будет работать для случаев с большим количеством цифр. Например, проверьте 2.1.1> 1.1.11. В вашем случае у вас будет 211> 1111, который сообщит, что версия 1.1.11 больше, чем 2.1.1.
Ответ №2:
Должно выполняться что-то вроде следующего:
NSDictionary *userInfo; // Assuming this is a dictionary
NSString *newVersionString = userInfo[@"gcm.notification.version"];
newVersionString = [newVersionString stringByReplacingOccurrencesOfString:@"." withString:@""];
NSInteger newVersion = [[[NSDecimalNumber alloc] initWithString:newVersionString] integerValue];
NSString *currentVersionString = [[NSUserDefaults standardUserDefaults] valueForKey:@"currentAppVersion"];
currentVersionString = [currentVersionString stringByReplacingOccurrencesOfString:@"." withString:@""];
NSInteger currentVersion = [[[NSDecimalNumber alloc] initWithString:currentVersionString] integerValue];
if(newVersion > currentVersion) {
//code here
}
Но это не то, как вы сравниваете версии. Проблема сейчас в том, что, например 1.11.1
, равно 11.1.1
. Или, другими словами, вы можете в любом случае переместить точки, но если количество цифр и их порядок останутся неизменными, вы обнаружите его как ту же версию. Вы должны делать это для каждого компонента (как в Swift, так и в Objective-C):
NSDictionary *userInfo;
NSArray<NSString *> *newComponents = [userInfo[@"gcm.notification.version"] componentsSeparatedByString:@"."];
NSString *currentVersionString = [[NSUserDefaults standardUserDefaults] valueForKey:@"currentAppVersion"];
NSArray<NSString *> *currentComponents = [currentVersionString componentsSeparatedByString:@"."];
BOOL newVersionIsGreater = NO;
if(newComponents.count != currentComponents.count) newVersionIsGreater = newComponents.count > currentComponents.count;
else {
for(int i=0; i<newComponents.count; i ) {
NSInteger newInteger = [[[NSDecimalNumber alloc] initWithString:newComponents[i]] integerValue];
NSInteger currentInteger = [[[NSDecimalNumber alloc] initWithString:currentComponents[i]] integerValue];
if(newInteger != currentInteger) {
newVersionIsGreater = newInteger > currentInteger;
break;
}
}
}
if(newVersionIsGreater) {
//code here
}
Теперь проверяется, есть ли у нас одинаковое количество компонентов в обоих случаях, а затем выполняется итерация по ним. Первый компонент, который отличается, сообщит об изменении.
Комментарии:
1. Это помогло мне именно так, как я хочу. Спасибо @Matic