Формат %i
предназначен для форматирования значения типа C int
, то есть 32-разрядного целого числа на всех текущих iOS платформах. Передача 64-разрядного целого числа вместо (в вашем случае: serviceId
) - неопределенное поведение, которое может вызвать cra sh.
Правильный формат для 64-разрядного целого числа - %lli
(для long long int
), и правильный формат для Int
(который может быть 32-разрядным или 64-разрядным) равен %li
(для long int
).
Так что это работает на обоих 32-разрядных и 64-разрядные устройства:
let predicate = NSPredicate(format: "serverID == %lli AND step == %li AND type == %@",
serviceId, step, "button")
«Более простым» способом является преобразование всех чисел в NSNumber
, поскольку вам не нужно запоминать правильные форматы для различных целочисленных типов. NSNumber
s являются «объектами» (экземплярами класса Objective- C) и могут быть просто отформатированы в формате %@
:
let predicate = NSPredicate(format: "serverID == %@ AND step == %@ AND type == %@",
serviceId as NSNumber, step as NSNumber, "button")
Передача аргументов в виде argumentArray
может работать случайно, но с неправильными форматами это все еще неопределенное поведение.