2015-07-13 5 views
-1

Использование Xcode 7 бета, Swift 2.0Избавиться от этих факультативных значений

Я спасаю и погрузочные учетные данные для брелка, так или иначе при загрузке я получаю «факультативный (значение)» назад, это выглядит, как это на самом деле часть строки, поскольку она также отображается так в текстовом поле или при отправке в API

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

func SaveCredentials(credentials : [String : String!]!) -> Bool 
{ 
    if(credentials.count == 2) 
    { 
     //only proceed when we have two keys: username and password 
     let username = credentials["username"] 
     let password = credentials["password"] 

     if let usernameStr = username 
     {//also tried username!=nil && password != nil 
      if let passwordStr = password 
      { //usernameStr and passwordStr is of type String! 
       let NsDataUsername = usernameStr!.dataUsingEncoding(NSUTF8StringEncoding) 
       let NsDataPassword = passwordStr!.dataUsingEncoding(NSUTF8StringEncoding) 
       if(NsDataUsername != nil && NsDataPassword != nil) 
       { 
        LocalStorage.saveToKeyChain("username", data: NsDataUsername!) 
        LocalStorage.saveToKeyChain("password", data: NsDataPassword!) 
        return true 
       } 
      } 

     } 
    } 
    return false 
} 

func LoadCredentials() -> [String : String!]? 
{ 
    let NsDataUsername = LocalStorage.loadFromKeyChain("username") 
    let NsDataPassword = LocalStorage.loadFromKeyChain("password") 
    if(NsDataUsername != nil && NsDataPassword != nil) 
    { 
     let username : String! = String(NSString(data: NsDataUsername!, encoding: NSUTF8StringEncoding)) 
     let password : String! = String(NSString(data: NsDataPassword!, encoding: NSUTF8StringEncoding)) 
     if let usernameStr = username 
     { 
      if let passwordStr = password 
      { // password is of type String!, passwordStr is of type String 
       var credentials : [String: String!] = [String : String]() 
       credentials["username"] = usernameStr 
       credentials["password"] = passwordStr 
       return credentials 
      } 
     } 
    } 
    return nil 
} 

И когда я отправляю Api, это мой метод, который также требует необязательной строки. Этот метод действительно работает при входе в систему, получая строки из текстовых полей, но не отфильтровывая это Необязательно при приходе из брелка.

func LoginUser(email : String!, password : String!) 
{ 
    print("LoginUser(email : \(email), password: \(password))") 
    var parameters = [String : AnyObject]() 
    parameters["UserName"] = email 
    parameters["Password"] = password 
    ...... 

Строки, которые я посылаю к методу SaveCredentials, те же, что пользователь вошел в систему с:

func LoginLocalAccount(email : String!, password : String!) 
{ 
    databaseAPI.LoginUser(email!, password: password!) //login goes just fine 
    saveCredentials(email!, password: password!) //manages to get Optional in it.. 
} 

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

Я хочу избавиться от них, потому что, когда приложение запускается, оно загружает учетные данные и пытается войти в мой API. Конечно, я получаю сообщение об ошибке, что имя пользователя не является действительным адресом электронной почты, поскольку оно является необязательным ([email protected])

+0

Во-первых, это ** НЕ ** не опциональным , Они являются неявно развернутыми опциями (которые, безусловно, являются опциями, которые могут определенно быть «nil»). Во-вторых, просто потому, что 'Необязательный ([email protected])' * prints * с функцией 'print' делает * not * означает, что он отображается в другом месте. – nhgrif

+0

Но это проблема, даже если я снова показываю их в текстовом поле, он показывает необязательный – CularBytes

+0

. Тогда это фактическое значение в строке. – nhgrif

ответ

3

Вы злоупотребляете !. Вы им не нужны. Попытайтесь узнать больше о неявно развернутых опциях, опциях, ... Ваш код - беспорядок (без обид, все учатся).

Назад к вашим опциональной проблем, это вызвано этой линией:

let username : String! = String(NSString(data: NsDataUsername!, encoding: NSUTF8StringEncoding)) 

convenience init?(data: NSData, encoding: UInt) - внутренняя часть использует failable инициализатору, поэтому, NSString? результата. После этого инициализация String с опционным NSString? также является необязательной. Но в этом нет никакого смысла делать это таким образом.

Первая часть - удалить факультативный

Используя новый guard:

guard let loadedPassword = NSString(data: passwordData, encoding: NSUTF8StringEncoding) else { 
    fatalError("Ooops") 
} 

loadedPassword содержит NSString (не NSString?) в настоящее время.

Вторая часть - NSString ->String

Ты, наверное, читали (если нет, то прочитайте) Strings and Characters о преодолении, ... Если вы можете свободно обмениваться NSString с String, вы можете думать, что вы сделано:

var dict = [String:String]() 
dict["password"] = loadedPassword 

Nope.Она производит следующее сообщение об ошибке:

NSString is not implicitly convertible to String ; did you mean to use 'as' to explicitly convert?

Незначительные изменения и теперь вы сделали:

var dict = [String:String]() 
dict["password"] = loadedPassword as String 

Полный пример

let password = "Hallo" 
guard let passwordData = password.dataUsingEncoding(NSUTF8StringEncoding) else { 
    fatalError("Ooops") 
} 

// save/load to/from keychain 

guard let loadedPassword = NSString(data: passwordData, encoding: NSUTF8StringEncoding) else { 
    fatalError("Ooops") 
} 

var dict = [String:String]() 
dict["password"] = loadedPassword as String 

print(dict) // "[password: Hallo]\n" 
+0

Привет, Роберт. Большое спасибо, я просто оптимизировал свой код, начиная пользоваться защитой, а затем сохранял и после загрузки. Это было действительно чрезмерное использование!, Никакого производственного кода вообще, просто выясняло, где это пошло не так. Не нашел эту ошибку, хотя на NSString, – CularBytes

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