Если я правильно понял ваш вопрос, версия Swift продиктована Podspec .
Более подробно, это выглядело бы так:
Pod::Spec.new do |spec|
...
spec.swift_version = '4.2'
...
end
Я предполагаю, что если это не учитывать, то в настоящее время по умолчанию используется значение 4.0.
Если вы хотите углубиться в детали, проверьте источник :
# @return [String] the Swift version for the target. If the pod author has provided a set of Swift versions
# supported by their pod then the max Swift version across all of target definitions is chosen, unless
# a target definition specifies explicit requirements for supported Swift versions. Otherwise the Swift
# version is derived by the target definitions that integrate this pod as long as they are the same.
#
def swift_version
@swift_version ||= begin
if spec_swift_versions.empty?
target_definitions.map(&:swift_version).compact.uniq.first
else
spec_swift_versions.sort.reverse_each.find do |swift_version|
target_definitions.all? do |td|
td.supports_swift_version?(swift_version)
end
end.to_s
end
end
end
Это не так плохо, как могло бы быть. Я только что протестировал его в Delphi 2009, и мне показалось, что, хотя параметр Self не использует семантику const , как вы, кажется, подразумеваете, что он должен, он также не использует var семантика, поэтому вы можете изменить ее все, что захотите, в своем методе, не теряя при этом ссылку, которую вызывающий объект имеет на ваш объект. Это было бы очень плохо.
Что касается причины, то один из двух ответов. Либо простая оплошность, либо то, что предложил Марко: позволить вам передать Self в параметр var .
Присвоение Себя настолько нелогично и бесполезно, что эта «особенность» это, вероятно, недосмотр. Как и в случае с присваиваемыми константами, такие проблемы не всегда легко исправить.
Здесь простой совет: не делайте этого.
Может быть, разрешить переход к параметрам const или var?
Это может быть артефакт, поскольку в системе нет «я» слева от знака: =.
На самом деле «Self» - это просто ссылка на имя места в стеке, в котором хранится адрес, указывающий на объект в куче. Возможно принудительное использование этой переменной только для чтения, видимо, дизайнер решил этого не делать. Я считаю, что решение произвольное.
Не вижу случая, когда это было бы полезно, это просто изменило бы значение в стеке. Кроме того, изменение этого значения может быть опасным, так как нет гарантии, что поведение кода этого элемента ссылочного экземпляра будет согласованным между версиями компилятора.
Обновлено: В ответ на PatrickvL
comment
"Переменная" "Я" отсутствует в стек (насколько мне известно, его никогда не было); Вместо этого значение помещается в зарегистрироваться (EAX, если быть точным) непосредственно перед выполняется вызов любого метода объекта. -
Нет, у Self есть фактический адрес в памяти. Попробуйте этот код, чтобы убедиться в этом сами.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Integer(@Self)));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
newform: TForm;
p: ^Integer;
begin
Self.Caption := 'TheOriginal';
newform := TForm.Create(nil);
try
newform.Caption := 'TheNewOne';
// The following two lines is, technically, the same as
// Self := newform;
p := Pointer(@Self);
p^ := Integer(newform);
ShowMessage(Self.Caption); // This will show 'TheNewOne' instead of 'TheOriginal'
finally
Self.Free; // Relax, this will free TheNewOne rather than TheOriginal
end;
end;
Иногда, когда вы хотите оптимизировать метод, насколько это возможно (не прибегая к сборке), «Self» можно (ab) использовать как «бесплатную» переменную - это может просто означать разницу между используя стек и используя регистры.
Конечно, содержимое стека, скорее всего, уже присутствует в кэше ЦП, поэтому доступ к нему должен быть быстрым, но регистры еще быстрее.
В качестве примечания: я все еще скучаю по дням, когда я программировал на Motorola 68000 от Amiga и имел роскошь 16 данных и 16 адресных регистров ... Я не могу поверить, что мир решил пойти с ограничено 4 регистрами линейки процессоров 80x86!
И в заключение, я иногда предпочитаю использовать Self, поскольку оптимизатор Delphi, ну, на самом деле, не так хорошо оптимизирует . (По крайней мере, это меркнет по сравнению с тем, что можно найти, например, в различных оптимизаторах LLVM.) ИМХО, и, конечно, YMMV.