Swift 3:
myButton.titleLabel?.font = myButton.titleLabel?.font.withSize(40)
Я определенно буду использовать функцию необязательных параметров 4.0. Это избавляет от нелепого ...
public void M1( string foo, string bar )
{
// do that thang
}
public void M1( string foo )
{
M1( foo, "bar default" ); // I have always hated this line of code specifically
}
... и помещает значения там, где вызывающий может их видеть ...
public void M1( string foo, string bar = "bar default" )
{
// do that thang
}
Гораздо проще и меньше подвержено ошибкам. Я действительно видел это как ошибку в случае перегрузки ...
public void M1( string foo )
{
M2( foo, "bar default" ); // oops! I meant M1!
}
Я еще не играл с компилятором 4.0, но я не был бы шокирован, узнав, что компилятор просто генерирует перегрузки для вас.
Я всегда использовал Delphi с необязательными параметрами. вместо этого я переключился на использование перегрузок.
Потому что, когда вы перейдете к созданию дополнительных перегрузок, вы неизбежно столкнетесь с необязательной формой параметра; и тогда вам все равно придется преобразовать их в необязательные.
И мне нравится идея, что обычно существует один супер метод, а остальные представляют собой более простые оболочки вокруг него.
Можно спорить о том, следует ли использовать необязательные аргументы или перегрузки или нет, но самое главное, что у каждого из них есть своя область, где они незаменимы.
Необязательные аргументы, когда они используются в комбинации с именованными аргументами, чрезвычайно полезны в сочетании с некоторыми длинными списками-аргументами-всеми-опциями вызовов COM.
Перегрузки чрезвычайно полезны, когда метод может работать с множеством различных типов аргументов (это только один из примеров), и, например, делает кастинг внутри; вы просто передаете ему любой тип данных, который имеет смысл (который принимается какой-то существующей перегрузкой). С необязательными аргументами это не сравнится.