Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
682 views
in Technique[技术] by (71.8m points)

swift - How to avoid force unwrapping a variable?

How do I avoid using the ! operation doing a force unwrap as using this is usually a bad option.

What is the better option with code like the following where using it makes the code look simpler and because of the if check the variable ! is called on will never be nil and so cannot crash.

My instructor introduced us to the bang(!) operator and then told us to never use it again. Telling us why of course, that it will crash our app if the optional is nil.

However I find myself in situations like these where the bang operator seems to be the most concise and safe option.

func fullName() -> String {
    if middleName == nil {
        return "(firstName) (lastName)"
    }else{
        return "(firstName) (middleName!) (lastName)"
    }
}

Is there a better way to do something like this?

Also, here's the full class if anybody is wondering.

class CPerson{
    var firstName: String
    var middleName: String?
    var lastName: String

    init(firstName: String, middleName: String?, lastName: String) {
        self.firstName = firstName
        self.middleName = middleName
        self.lastName = lastName
    }
    convenience init(firstName: String, lastName: String) {
        self.init(firstName: firstName, middleName: nil, lastName: lastName)
    }
    func fullName() -> String {
        if middleName == nil {
            return "(firstName) (lastName)"
        }else{
            return "(firstName) (middleName!) (lastName)"
        }
    }
}

My instructor said "If I see you using the bang operator, we're going to fight" O_O

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Use the if let or guard constructs:

func fullName() -> String {
    if let middleName = middleName {
        return "(firstName) (middleName) (lastName)"

    } else {
        return "(firstName) (lastName)"
    }
}

func fullName() -> String {
    guard let middleName = middleName else {
        return "(firstName) (lastName)"
    }
    return "(firstName) (middleName) (lastName)"
}

I've put the guard statement in for completeness but as others have commented this is more commonly used in an error/failure case.

I would also advise against using string interpolation for Strings. They are already strings, there is no need to use the description of each name in a new string.

Consider return firstName + " " + lastName. See Difference between String interpolation and String initializer in Swift for cases when string interpolation could return an unexpected result.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...