2016-10-09 4 views
1

非常に新しいので、ここでは非常に単純な問題ですが、UserDefaultsからオプションのラップを解除するのに苦労しています。 UIDの値は "dan"です。ここでは、コードがあります:スウィフト - オブジェクトが存在するかどうかを確認した後でも「オプション」を表示します。

override func viewDidLoad() { 
    super.viewDidLoad() 

    let uidObject1 = UserDefaults.standard.object(forKey: "UID") 

    if let uid = uidObject1 { 
      updateUsername.setTitle("\(uid)", for: UIControlState.normal) 
      print("on load \(uid)") 
    } 
} 

これは、ボタンupdateUsernameラベルを変更しても、次のコンソールに出力します...オプションの負荷(「ダン」)に

私はできませんOptional()を取り除く。私はuidをアンラップしようとしました。

プリント( "ロード上(UID!)")

Xcodeのは、私は非オプション型 'どれ' がアンラップ値を強制することはできませんと言われますよう。

周囲を検索すると、if let uid = uidObject1のチェックで、uidObject1が存在する場合にのみ実行されるOptional()が削除されていることが分かりました。誰かが私を正しい方向に向けることができますか?

編集: ここは私のコードです。

@IBAction func updateUsername(_ sender: AnyObject) {       
    if let uid = userName.text {       
     UserDefaults.standard.set("\(userName.text)", forKey: "UID")     
     updateUsername.setTitle("\(uid)", for: UIControlState.normal)     
    }   
} 

ANSWER - そのようにセット(userName.text)をアンラップするために必要な>(userName.text!)解決しました。 Oliverに感謝します。

+5

ようstring(forKey:)方法を使用して:UIDを割り当てる場合、あなたはこのようにしたいタイプにキャストする必要がありますstring 'オプション(" dan ")'。 –

答えて

0

UIDをUserDefaultsに設定すると、印刷に使用したのと同じ方法で文字列を設定すると思います。しかし、その時点でオプションの文字列を展開しないと、文字列は「オプション(Dan)」として保存されます。したがって、上のコードでは正しくアンラップしていますが、文字列はすでに「オプション(Dan)」です。

例:UIDの値を設定するには、あなたのコードは、おそらくこの

UserDefaults.standard.setValue("\(name)", forKey: "UID") 

のように見えますが、名前はオプションです。名前のラップを解除し、問題を修正する必要があります。

+0

Oliverありがとうございます。私はUserDefaults.standard.set( "\(userName.text!)"、forKey: "UID")のように、set userName.textのラップを解除しました - そして今はオプションとして戻って来ない、実際にはオプション。ご協力いただき誠にありがとうございます。 – Dan

+0

問題ありません!私が助けてくれるとうれしいです:) –

+0

KVCの機能が分かっていない限り、 'setValue'を使わないでください。 – vadian

-1

object(forKey:)は、Any?の値を返します。

guard let uidObject1 = UserDefaults.standard.object(forKey: "UID") as? String else { return } 

またはおそらくあなたは以前に「UID」のデフォルトを設定することを意味し

guard let uidObject1 = UserDefaults.standard.string(forKey: "UID") else { return } 
関連する問題