2016-12-01 15 views
1

私はSwiftをコード化するときに気付いたことがあります。私はオプションを使用すると、自動的にコンパイラから正しいものが得られ、その背後にある意味を理解しようとしています。オプションの変数があり、それをアンラッピングせずに使用しようとすると、しばしばXcodeから(?)!オートコレクションを取得します。私は私のUITableViewのデータソースのコレクションになりますオプションのプロパティを持っている私のコードでスウィフト3:アンラップしたまわりの括弧の意味

enter image description here

var procedures: [Procedure]?

まず私はそうのようにそれを使用しようとします

コンパイラはself.procedures?シンタックスのサフィックスを使用する必要があることを伝えています。

enter image description here

だから私は、小さな赤い丸をクリックすると、それはそうのように私のためにオートコレクトがあります。

enter image description here

しかし、今でも、コンパイラは不平を言っています。あなたが聞いたことについて?

enter image description here

:まあ、それはどうやらだから私は再び小さな赤い丸をクリックして、そのように正確な自動それを持って... self.procedures?.[indexPath.row]が終わり !強打演算子と括弧で囲まなければ

を望んでいます

コンパイラは満足していますが、私はそうではありません。なぜあなたは頼むことができないのですか?私はここでかっこが何をしているのか分かりません。

説明できますか?

+0

ほとんどの場合、括弧を安全に削除することができます –

答えて

0

だから、あなたが見ることができるように、オプションの

var procedures: [Procedure]? 

として、あなたの手続きを宣言している、あなたが手順

cell.configureWithProcedure(procedure: Procedure) 

を受け入れる関数に渡ししようとしている次に、あなたがしようとしていますこのようなインデックスを使用してプロシージャにアクセスする

self.procedures[indexpath.row] 

これはエラーとなるself.proceduresはオプションですので、アンラップして追加する必要がありますか?

self.procedures?[indexpath.row] 

これは、問題を解決しますが、それの結果はProcedure正常だがオプションの手順ではありません - >Procedure?
だから、Xcodeはあなたので、それをアンラップするためのヒントを与え、あなたのconfigureWithProcedure開封された手順を発生します。この

(self.procedures?[indexPath.row])! 

この操作のように書かれますProcedureないProcedure?の1行を求めるが、私はあなたをお勧めしません。それは危険だから!演算子を使うので、私はあなたがこの

if let procedure = self.procedures?[indexPath.row] { 
    cell.configureWithProcedure(procedure: procedure) 
} 

EDITのように行うことをお勧めします:あなたのCAに

手順は

extension UITableViewCell { 
    dynamic class func emptyCell() -> UITableViewCell { 
     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil) 
     cell.selectionStyle = UITableViewCellSelectionStyle.None 
     return cell 
    } 
} 

存在し、この

if let procedure = self.procedures?[indexPath.row] { 
    cell.configureWithProcedure(procedure: procedure) 
} else { 
    return UITableView.emptyCell() 
} 

またはより良い使用ガード

guard let procedure = self.procedures?[indexPath.row] else { 
    return UITableView.emptyCell() 
} 
cell.configureWithProcedure(procedure: procedure) 

が私の答えはあなたを助けることを願ってのようにそれを書きされていない場合、SEあなたは空のセルを返すことができます。 !

+0

したがって、 '()'は「ヒント」と言っていますか?私は、もしそれが私が持っていた問題にぶつかることなくこれを行うより安全な方法であるならば、もし私が手続きをしなければどうすればよいのかを理解することができます。それから 'else 'に' if let'の後に 'return nil'と言う必要がありますが... ... Swiftは私たちがそれをするのを好きではありません。スウィフトは満足するのが難しいので、私は岩と硬い場所の間に残されています。 –

+0

@BrandonAはい、このように 'self.procedures?[indexPath.row]!'のように展開することはできません。上記のように中かっこ( ')'で囲む必要があります。あなたの問題では、選択肢がたくさんあります。上記のように空のセルを返すか(編集済みのチェックをチェック)、configureWithProcedureを変更してオプションを受け入れ、デフォルト値を表示するように設定するか、プロシージャが存在しない場合は、おそらく空のセルです。 –

+0

プロシージャ配列のProcedureオブジェクトが決してnilにならないことが確かな場合は、それをvarプロシージャとして宣言することもできます。[Procedure!]?したがって、()で配列内のオブジェクトのアンラッピングを要求しません。 –

関連する問題