2016-08-01 3 views
2
if let mathematicalSymbol = sender.currentTitle { 
    brain.performOperation(mathematicalSymbol) 
} 

Код ошибки содержит нижеприведенную ошибку;Дополнительная ошибка привязки к Swift 2.2?

Значение необязательного типа 'String?' не разворачивается; вы имели в виду использовать '!' или '?'?

Как видно на этом снимке экрана;

enter image description here

sender.currentTitle является необязательным.

Вот выдержка из «The Swift Programming Language (Swift 2.2)» от Apple под кодом примера чуть ниже нее;

Если необязательное значение nil, условный это false и код в фигурных скобках пропускаются. В противном случае, необязательное значение развернутого и назначен постоянный после let, что делает развернутого значения доступного внутри блока кода.

Вот пример кода для этой выдержки;

var optionalName: String? = "John Appleseed" 
var greeting = "Hello!" 
if let name = optionalName { 
    greeting = "Hello, \(name)" 
} 

Так по этим причинам, я имею в виду, что либо я что-то отсутствует или что я удара об ошибке.

Я также пробовал что-то подобное на игровой площадке и не получал подобной ошибки;

enter image description here

Вот мой Swift версия;

Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31) 
Target: x86_64-apple-macosx10.9 
+0

Возможно, связанные с: [Странное поведение Свифта AnyObject] (http://stackoverflow.com/questions/33388830/the-strange-behaviour-of-swifts-anyobject). –

ответ

2

Если вы посмотрите на currentTitle, вы увидите, что это, скорее всего, будет выведено String??.Например, перейти к currentTitle в Xcode и ударить по Esc ключ, чтобы увидеть варианты завершения кода, и вы увидите, какой тип он думает, что это:

enter image description here

Я подозреваю, что у вас есть это в методе определение sender, как AnyObject, такие как:

@IBAction func didTapButton(sender: AnyObject) { 
    if let mathematicalSymbol = sender.currentTitle { 
     brain.performOperation(mathematicalSymbol) 
    } 
} 

Но если вы явно сказать ему, какой тип sender, вы можете избежать этой ошибки, а именно: либо

@IBAction func didTapButton(sender: UIButton) { 
    if let mathematicalSymbol = sender.currentTitle { 
     brain.performOperation(mathematicalSymbol) 
    } 
} 

Или

@IBAction func didTapButton(sender: AnyObject) { 
    if let button = sender as? UIButton, let mathematicalSymbol = button.currentTitle { 
     brain.performOperation(mathematicalSymbol) 
    } 
} 
+0

'if let MathematicalSymbol = (отправитель as? UIButton) ?. currentTitle {' также работает. – vacawama

+0

Да, это тоже работает! – Rob

+1

Я нахожу это раздражающим, что Xcode по умолчанию имеет значение 'AnyObject' для типа' sender'. 'AnyObject' редко используется тем, кого кто-то хочет для отправителя, поэтому пользователю нужно выбирать его, если они действительно этого хотят, ИМХО. – vacawama

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