Наличие аргумента, помеченного size
в дозе инициализатора, не обязательно означает, что существует свойство с именем size
.Это просто ввод значений для класса, чтобы инициализировать любое из его свойств.В этом случае size
передается, чтобы стать sideLength
нижележащего квадрата и Equностороннего треугольника.
Вам не нужно передавать переменную с тем же именем, что и метка аргумента, важен только тип.sideLength
это просто метка, она принимает тип Double
.size
- это переменная с типом Double
.Следовательно, square = Square(sideLength: size, name: name)
имеет смысл.
Если вы укажете в функции метку аргумента и имя переменной, это будет выглядеть примерно так: func foo(n x : Int){print(x)}
, где n
- метка аргумента, x
- этоимя переменной при обращении к ней внутри функции, Int
является типом этого аргумента.Эта функция будет вызываться с foo(n:1)
Подчеркивание используется, если вы хотите, чтобы у аргумента не было метки.
Например, func foo(_ x : Int){print(x)}
можно вызвать с помощью foo(1)
.Вы можете спросить, когда это будет полезно?Именно тогда аргументы вашей функции настолько очевидны, что добавление метки не обеспечивает большей читабельности.
например, func sum(_ a : Int, _ b: Int){return a + b}
очевидно, что добавление метки к любому из входных данных вообще не улучшает читаемость, так как они не имеют смысла.sum(a:1,b:2)
НЕ является улучшением читабельности по сравнению с sum(1,2)
.
Если вы не предоставите отдельную метку аргумента и имя переменной, одно и то же имя будет использоваться и как метка аргумента, и как имя переменной.
например func foo(x : Int){print(x)}
должен вызываться с foo(x : 1)