2

私はswiftが初めてで、オプションの値を正しく使用する方法がよくわかりません。

状況は次のとおりです。まず、プロパティのいくつかの値を保存し、値を取得するためにサーバーに要求を送信するモデル クラスがあります。コード:

import Foundation

class User: NSObject {

    var name: String?

    func getInfo(updateUI: () -> ()) {
        let manager = AFHTTPSessionManager()
        manager.POST(URLString, parameters: nil, success: { (task: NSURLSessionDataTask, responseObject: AnyObject?) in

            let dic = responseObject as? NSDictionary
            self.name = dic?.objectForKey("name")
            updateUI()

        }, failure: { (task: NSURLSessionDataTask?, error: NSError) in
            log.obj(error)
    })

}

次に、このモデルを ViewController で使用して、サーバーから値を取得し、UI を更新したいと考えています。コード:

class UserViewController: UIViewController {

    @IBOutlet var nameLabel: UILabel!
    var user = User()

    override func viewDidLoad() {
        super.viewDidLoad()

        user.getInfo({
            nameLabel.text = user.name!
        })
    }

}

レーベルに載せたいと思った時に確実に自分の名前を持っていると保証できるものがないので、この仕事の扱い方は危険だと思います。ほとんどの場合はうまく機能しますが、サーバーから正しい値を取得できない場合 (たとえば、キー「name」の値がない場合) にクラッシュする可能性があります。

上記の質問について 2 つの考えがあります。

  1. 次のようなプロパティのデフォルト値を指定します。var name = ""
  2. 次のように、ワープを解除する前に値をテストします。

    if let foo = user.name {
        nameLabel.text = foo
    }
    

最初の方法を選択したい理由は次のとおりです。

  1. ラベルにデフォルトの文字列を表示することは、オプションの値のワープを解除できないため、クラッシュよりもはるかに受け入れられると思います。
  2. 使用する値がさらに多くなると、コードが非常に長くなり、読みにくくなります。

私は正しいものを選びましたか?または、どちらもオプションの値の使用法を理解していませんでした。より良い方法はありますか? 誰かが私を助けることができますか?

4

2 に答える 2

3

次のように、新しい変数を宣言せずに、オプションを安全にアンラップするか、デフォルト値を与えることができます。

nameLabel.text = user.name ?? ""

これは nil 合体演算子と呼ばれ、optional をアンラップしようとします。アンラップが失敗した場合、オペレーターの rhs に配置したデフォルト値が与えられます。

于 2016-08-11T19:00:21.490 に答える
3

オプションの強制アンラップはお勧めできないというあなたの本能は正しいです。nil 以外のデフォルト値を指定すると、オプションの目的が無効になることも正しいです。

if let foo = user.nameバインドはこれを行う適切な方法ですが、値を割り当てるだけの場合は、pbush25 が述べているように、nil 合体演算子を使用して中かっこを節約できます。

nameLabel.text = user.name ?? "Default Label Text"

これは、「user.name のラップを解除し、その値が nil でない場合はそれを使用することを意味します。それ以外の場合は、次の値を使用します:」たとえば、ユーザーの ID をフォールバック ラベル テキストとして使用したい場合は、それらをチェーンすることもできますが、 ID も存在しない可能性があります。

nameLabel.text = user.name ?? user.id ?? "No name or ID".

オプションの値が nil の場合にクラッシュしたい場合でも、少なくともエラー メッセージを提供できるように、単にオプションを強制的にアンラップするよりも、assertまたは a を使用する方がよいでしょう。preconditionFailure()

于 2016-08-11T19:18:26.797 に答える