2016-09-29 6 views
2

Я новичок в яблоке Swift.Я пытаюсь создать демонстрационное приложение на основе этого tutorial. Я обнаружил, что приложение не работает. После нескольких проб и терпит неудачу, я обнаружил, что если я изменить строку кода:В какой ситуации следует использовать _ в качестве параметра в swift

func textFieldDidEndEditing(textField: UITextField) { 

к

func textFieldDidEndEditing(_ textField: UITextField) { 

Я могу запустить код правильно.

Я хочу знать, что происходит, добавив _ в качестве одного из аргументов. Оба этих метода не приведут к ошибкам компиляции. Но первый один действительно дает предупреждение как:

ViewController.swift:35:10: Instance method 'textFieldDidEndEditing(textField:)' 
nearly matches optional requirement 'textFieldDidEndEditing' of protocol 'UITextFieldDelegate' 

Поскольку первый один даются яблочным учебником, я не уверен, является ли это ошибка. Может кто-нибудь уточнить мои сомнения?

+0

Я использую последнюю версию Xcode – user3588276

+0

Вы можете иметь правильный ответ здесь: [? Что такое _ подчеркивание представитель в Swift Ссылки] (http://stackoverflow.com/questions/24437388/whats-the-underscore-representative-of-in-swift-references) –

ответ

2

Я думаю, вы используете Swift 3.0. Следующее руководство может быть версией Swift 2.2 или Swift 2.3. Это не что иное, как синтаксическое изменение от того, что я наблюдал. Еще вчера я сталкивался с этой ситуацией, когда я обновлен до Xcode 8.0

0

, если вы хотите использовать несколько параметров без внешнего имени, вы должны использовать»_» символ подчеркивания в качестве внешнего имени:

1

От Swift 3 Первый аргумент метки также являются стандартными для инициализаторов.

Swift 3 Evolution

Первые заявления параметров будут соответствовать существующему поведению второго и последующих параметров. Все параметры, независимо от положения, будут вести себя равномерно. Это создаст простой, последовательный подход к объявлению параметров на всем языке программирования Swift и приведет к объявлению метода и функции в синхронизации с инициализаторами, которые уже используют этот стандарт.

Например

func foo(x: Int, y: Int) 

объявим foo(x:y:) и не foo(_:,y:).

Существующие внешние надписи на этикетках будут продолжать применяться к первым параметрам. Вы устанавливаете имена внешних параметров до имени локального параметра, которое оно поддерживает, разделенное пробелом. Например,

func foo(xx x: Int, yy y: Int) //declares foo(xx:yy:) and 

func foo(_ x: Int, y: Int) //explicitly declares foo(_:y:) 

Подробнее о первом параметре в SE-0046

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

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