问题
When I am about to fire my segue for the 2nd view I also send some values like this:
if let aTime = ads[indexPath.row]["unix_t"].int {
toView.time = aTime
}
if let aTitle = ads[indexPath.row]["title"].string {
toView.title = aTitle
}
In the second VC I have declared the varibles like:
var time: Int?
var title: String?
and this is how I unwrap the values:
if time != nil {
timeLabel.text = String(time!)
}
if title != nil {
titleLabel.text = title!
}
This all works I never get any error caused by unwrapped varibles or nil values. But is there any easier way to do it?
Right now it feels like I am checking too much
回答1:
I can think of three alternatives.
if/let
. Very similar to your current option, but you don't have to implicitly unwrap.if let time = time { timeLabel.text = "\(time)" } if let title = title { titleLabel.text = title }
You can even unwrap them on the same line. The downside to this is that if one of them is
nil
, then neither label will be set.if let time = time, let title = title { timeLabel.text = "\(time)" titleLabel.text = title }
guard/let
. If these are in a function likesetupViews()
, then you can one-line your unwrapping like so:func setupViews() { guard let time = time, let title = title else { return } timeLabel.text = "\(time)" titleLabel.text = title }
You can use default values and the
??
operator to unwrap quickly.timeLabel.text = "\(time ?? 0)" titleLabel.text = title ?? ""
回答2:
You can use the Nil Coalescing Operator
too as given in the Docs:
The nil coalescing operator (a ?? b) unwraps an optional a if it contains a value, or returns a default value b if a is nil. The expression a is always of an optional type. The expression b must match the type that is stored inside a.
The nil coalescing operator is shorthand for the code below:
a != nil ? a! : b
回答3:
if let time = time {
timeLabel.text = "\(time)"
}
if let title = title {
titleLabel.text = title
}
It's the same as with your JSON
回答4:
Yes, you are checking too much (twice).
Since only non-optional values are passed you can declare the variables non-optional
var time = 0
var title = ""
and set the labels
timeLabel.text = "\(time)"
titleLabel.text = title
The strong type system of Swift highly recommends first to consider
Can I accomplish this without optionals?
and – if there is no other option – then use optionals.
回答5:
You don't need to check nil condition in the first view. Please follow below code:
toView.time = ads[indexPath.row]["unix_t"] as? Int
toView.title = ads[indexPath.row]["title"] as? String
time and title variable in second view are optionals. So, when you assign a value to toView.time and toView.title, it will either assign the value of type time and title respectively or nil.
来源:https://stackoverflow.com/questions/38061226/swift-safely-unwrapping-optinal-strings-and-ints