Вы начинаете с того, что говорите:
NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280
Но это не так. % qu означает "эта штука длинная без знака". Но эта вещь не длинная без знака. Это объект! Это NSNumber , обернутый вокруг unsigned long long. Вы лжете NSLog, поэтому вы получаете вывод мусора в самом первом заявлении.
Теперь попробуйте это на своей машине:
uint64_t x = 16204893883745507648ULL;
NSLog(@"%qu", x);
NSNumber* n = [NSNumber numberWithUnsignedLongLong:x];
NSLog(@"%@", n);
NSLog(@"%@", [n stringValue]);
Все эти операторы NSLog дают одинаковый результат - потому что все они являются правильными формулировками, в отличие от той, с которой вы начали. Итак, эти заявления NSLog показывают вам то, о чем вы должны говорить.
Теперь вы можете подумать: О, отлично, так что я могу перейти от NSNumber к строке NSS с stringValue
в конце концов. Да, но ты не можешь вернуться снова. Мы не можем перейти от [n stringValue]
к правильному номеру NSNumber с помощью longlongValue
, потому что long long - это не unsigned long long. Там нет unsignedLonglongValue
. Так что вы не можете добраться отсюда.
Так что же делать правильно? Не конвертируйте вообще! У вас есть NSNumber, он действителен, просто сохраните его и используйте. NSNumber - это значение, которое вы можете хранить в своей модели. (Например, он может входить в словарь как значение или как ключ, это может быть значение по умолчанию для пользователя и т. Д.)