Kamilski81
Kamilski81

Reputation: 15107

How do I prevent my text from displaying Optional() in the Swift interpolation?

How do I prevent my text from displaying Optional() in the Swift interpolation?

My text displaying is :

---You can only switch properties once all images from Optional("PPP") have finished uploading.---

Here is my code

let imagesLeftToUpload = syncer!.imagesToUpload?.count
        if(imagesLeftToUpload != nil && imagesLeftToUpload! > 0) {
            let propertyConfig = syncer!.getPropertyConfig()
            var propertyNameStr: String = ""
            if(propertyConfig != nil && propertyConfig!.propertyName != nil) {
                propertyNameStr = "from \(propertyConfig!.propertyName)"
            }
            messageText.text = "You can only switch properties once all images\(String(describing: propertyNameStr)) have finished uploading."
        }

Upvotes: 0

Views: 382

Answers (3)

Yuan Fu
Yuan Fu

Reputation: 361

Swift is doing this because you provided an optional string, not a string. To solve it you need to unwrap the optional.

You can either use ! to unwrap an optional string, such as:

messageText.text = "You can only switch properties once all images\(propertyNameStr!) have finished uploading."

Or you can use a if statement to unwrap the optional.

if let nameString = propertyNameStr {
    messageText.text = "You can only switch properties once all images\(nameString) have finished uploading."
}

Upvotes: 1

Kamilski81
Kamilski81

Reputation: 15107

I ended up going with the following because I didn't want to use guard, but I wanted to always display the message:

            var propertyNameStr = ""
            if let propertyName = syncer!.getPropertyConfig()?.propertyName {
                propertyNameStr = "from \(propertyName) "
            }
            messageText.text = "You can only switch properties once all images \(propertyNameStr)have finished uploading."

Upvotes: 0

David Pasztor
David Pasztor

Reputation: 54706

Use optional binding to safely unwrap the optionals, then use String interpolation on the non-optional value.

guard let imagesLeftToUpload = syncer?.imagesToUpload?.count, imagesLeftToUpload > 0 else {return}
guard let propertyConfig = syncer?.getPropertyConfig(), let propertyName = propertyConfig.propertyName else {return}
messageText.text = "You can only switch properties once all images\(propertyName) have finished uploading."

Upvotes: 4

Related Questions