Как принудительно привести и преобразовать тип данных в objective c

#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