Кодирование/декодирование CGFloat на 32-по сравнению с 64-разрядным

Perl6
sub factorial ($n) { [*] 1..$n }

Я почти не знаю о Perl6. Но я думаю, что этот [*] оператор такой же, как у Хаскелла product.

Этот код работает на мопсах и, возможно, попугаях (я не проверял.)

редактировать

Этот код также работает.

sub postfix: ($n) { [*] 1..$n }

# This function(?) call like below ... It looks like mathematical notation.
say 10!;

10
задан Rob Keniger 17 November 2009 в 03:23
поделиться

1 ответ

Что произойдет, если пользователь запустит 64-разрядную версию приложение сохраняет файл, в котором эти значения закодированы как двойники, а файл открывается / разархивируется в 32-битной системе?

Ничего особенного. Файл содержит двойной , и предположительно вы ' повторно отправив decodeDouble: forKey: для получения значения, поэтому вы получите double . Затем вы можете преобразовать его в CGFloat - который потеряет точность, если вы работаете на 32-битной машине, но вам рано или поздно придется выполнить это преобразование. (Даже если вы держите double , вам все равно придется приводить к CGFloat , когда вы передаете значение в Quartz / AppKit / UIKit.)

Рассмотрите альтернативу: Вы сохраняете float в файле на 64-битной машине, а затем загружаете файл обратно на ту же машину. Вы и Quartz можете обрабатывать полную точность 64-битного типа double , но у вас его нет, потому что вы выбросили его при записи файла. Если значение вообще изменилось при применении, это изменение теперь навсегда.

Поэтому я рекомендую всегда использовать тип double с NSKeyedArchiver, если только вы не знаете, что никогда не собираетесь использовать что-либо, кроме float (т. Е. целевой API использует только float , никогда double ). Это не относится к Quartz, поэтому для CGFloat используйте double .

12
ответ дан 4 December 2019 в 00:25
поделиться