2017-01-31 5 views
1

Я изучаю быстро, и символ _ дает мне много неприятностей. В уроке яблок «Разработка приложений в быстром» уроке №15 мы учимся строить структуры. Я пытаюсь понять разницу между использованием _: представлять безымянный параметр и с помощью _ Строки: представлять что-то (предположительно другой безымянный параметр, но мы даем ему имя?)Какая разница/вариант использования для _: vs _ String: при записи функций

вот мой пример код:

struct Rectangle { 
     let width: Int 
     let height: Int 
     var area: Int { 
      return width*height 
     } 

func biggerThan(_ rectangle: Rectangle) -> Bool { 
    return area > rectangle.area 
    } 
} 

В то же время, что и мой основной вопрос, я не понимаю, почему эта функция работает либо как (_ rectangle: Rectangle), либо (_:Rectangle) без изменения обратной линии кода.

+0

Ваш код не будет скомпилирован, если вы измените '(_ rectangle: Rectangle)' на '(_: Rectangle)', поскольку вы используете 'rectangle' в теле. – Hamish

+0

hamish, я также подумал, что не будет. Игровая площадка xcode скомпилирована. прямоугольник слова изменился с белого на зеленый, но он по-прежнему запускает код, как ожидалось. –

+0

Не тестируйте на детской площадке - они супер глючные и ненадежные. Протестируйте его в реальном проекте, и вы увидите, что он не компилируется. – Hamish

ответ

3

Возможно, вы сталкиваетесь с проблемами версии Swift. В Swift 3, один из два синтаксиса требуется:

func foo(bar:String, bar2:Int) { 
} 

func foo(_ bar:String, bar2:String) { 
} 

func foo(bar:String, _ bar2:String) { 
} 

func foo(_ bar:String, _ bar2:Int) { 
} 

И соответствующие вызовы этой функции являются:

foo(bar: "Hello World", bar2: 1) 
foo("Hello World", bar2: 1) 
foo(bar: "Hello World", 1) 
foo(bar: "Hello World", 1) 

То есть, и подчеркивание в подписи означает, что вы не объявляете его в вашем вызов.

НО Во всех предыдущих версиях Swift, первый параметр имеет подразумеваемое подчеркивание, делая соответствующие вызовы:

foo("Hello World", bar2: 1) 
foo("Hello World", bar2: 1) 
foo("Hello World", 1) 
foo("Hello World", 1) 

Также обратите внимание, что в то время как вы можете рассмотреть подчерк в явном объявит не использовать имя, вы можете также переименовать вещи:

foo(bar myBar:String, bar2 myBar2:Int) { 
    // internally refer to myBar and myBar2, not bar and bar2 
} 

И вызов:

foo(bar: "Hello World", bar2: 1) 
+0

Большое спасибо dfd, что очищает ситуацию для меня –

 Смежные вопросы

  • Нет связанных вопросов^_^