2015-10-27 3 views
0

У меня есть странная проблема, пытающаяся проверить ввод пользователя. Я использую оболочку для рамки формы, и я хочу, чтобы она могла проверять ввод пользователя. Беда в том, когда я называю замыкание с аргументом userValue, он заканчивает тем, ноль и все проверки возвращают ложь:Закрытие аргумента становится nil

class FormRowWrap { 
    var tag: String 
    var row: AnyObject 
    var verification: (value: Any?) -> Bool 
    init(tag: String, row:AnyObject, verification:(Any?) -> Bool) { 
     self.tag = tag 
     self.row = row 
     self.verification = verification 
    } 
} 

class InsertViewController: FormViewController { 

let rows = [ 
    { 
     let tag = "Fuel Name" 
     let row = FormRowWrap(tag: tag, 
      row:TextRow(tag) { 
       $0.title = tag 
       //    $0.value = last known user default 
      }, 
      verification:({(value: Any?) -> Bool in 
       if let thing = value as? String { 
//^----- the value in a **breakpoint here is nil** 
// 
        if !thing.isEmpty { 
         return true 
        } 
       } 
       return false 
      })) 
     return row 
     }() as FormRowWrap, 

    { 
     let tag = "Price" 
     let row = FormRowWrap(tag: tag, 

...

func formValuesAreValid(values: [String: Any?]) -> Bool { 
    var result = false 
    for rowWrap in self.rows { 
     let userValue = values[rowWrap.tag] 
     print("userValue  \(userValue) forTag: \(values[rowWrap.tag])") 
// ^---- this prints userValue  **Optional(Optional("Ghh")) forTag: Optional(Optional("Ghh"))** 
     let entryIsValid = rowWrap.verification(value: userValue) 

     if (!entryIsValid) { 
      result = false 
      return result 
     } 
    } 
    result = true 
    return result 
} 

Если я бегу rowWrap.verification (value: «test»), он возвращает true, поэтому я думаю, что это проблема правильного разворачивания значений.

ответ

0

Ваша функция должна опционное но userValue является факультативным внутри другого Дополнительно:

Дополнительно (опционально ("Ghh"))

Так что, когда вы вынуждаете разворачивать его с

let entryIsValid = rowWrap.verification(value: userValue!) 

что происходит на самом деле, это то, что вы разворачиваете первый слой и возвращаетесь по дополнительному запросу:

Дополнительно ("Ghh")

что и ваша функция подписи

(value: Any?) -> Bool 

потребности.

О почему он обернут дважды:

с

formValuesAreValid (значения: [String: Любой])

значения в values словаре являются Optionals, и затем при доступе к словарю:

let userValue = values[rowWrap.tag] 

вы получаете еще один Необязательный - поскольку доступ к словарю всегда возвращает Необязательный, поэтому в этом случае values[rowWrap.tag] возвращает «Необязательный Необязательный».

Затем в другом месте вы разворачиваете, думая, что получите значение if let thing = value as? String, но вместо этого вы получите внутренний вариант Дополнительно, а следующая проверка не будет выполнена.

+0

Спасибо за ответ! –

+0

Добро пожаловать. :) – Moritz

0

Найден способ заставить его работать силой разворачивания «userValue»:

пусть entryIsValid = rowWrap.verification (значение: userValue)

Я до сих пор не понимаю, почему это работает и почему он не работает с аргументом как необязательный.

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