swift那点事儿之optional(可选绑定)

URL参照:https://qiita.com/hachinobu/items/2ecfc5999327fff20837#はじめに

  • 例题一:有一张图片从String类型转化为UIImage,用UIImageView去表示

処理流程

1.URLdeString型转化为NSURL型
2.NSURL型`转化为NSData型
3.NSData型转化为UIImage型之后用UIImageView展示

1,2,3每次的转化处理都用到Optional型的返回値去做処理

let urlString = "https://pbs.twimg.com/profile_images/3734255592/0b417aa61da0196cfed35889928ee895.png"

if let url = NSURL(string: urlString), data = NSData(contentsOfURL: url), image = UIImage(data: data) {
    UIImageView(image: image)
}

如果NSURL(string: urlString)或者NSData(contentsOfURL: url)不能被非Optional型去处理的場合、那么処理便会结束,不会进入if代码块内

上记代码 于下记代码等同

if let url = NSURL(string: urlString) {
    if let data = NSData(contentsOfURL: url) {
        if let image = UIImage(data: data) {
            UIImageView(image: image)
        }
    }
}

・例题二:上述例题加一个条件,URL的文件类型只能是PNG的图片才能显示

let urlString = "https://pbs.twimg.com/profile_images/3734255592/0b417aa61da0196cfed35889928ee895.png"
//urlString先通过optional型处理转化为NSURL之后在where中确认是否为png图片
if let url = NSURL(string: urlString) where url.pathExtension == "png", let data = NSData(contentsOfURL: url), image = UIImage(data: data) {
    UIImageView(image: image)
}

urlString先通过optional型处理转化为NSURL之后在where中确认是否为png图片

非optional型的处理若直接放入if中会error:

Initializer for conditional binding must have Optional type, not [SubSequence]

解决方式 明确返回的类型或者用Optional.Some()强制为optional型去做处理

・例题三

需求: 如果图片URL用“/”进行划分后最后一个元素长度小于5的不显示。

let url: String? = "http://qiita.com/hachinobu/items/aedac203f42b215e6df4"
if let unwrapUrl = url, elements = unwrapUrl.characters.split("/"), last = elements.last where last.count > 5 {
    print(String(last))
}

error发生:Initializer for conditional binding must have Optional type, not [SubSequence]

解决方式:1.明确返回的类型

let url: String? = "http://qiita.com/hachinobu/items/aedac203f42b215e6df4"
if let unwrapUrl = url, elements: [String.CharacterView] = unwrapUrl.characters.split("/"), last = elements.last where last.count > 5 {
    print(String(last)) //aedac203f42b215e6df4
}

解决方式:2.用Optional.Some()强制为optional型去做处理

let url: String? = "http://qiita.com/hachinobu/items/aedac203f42b215e6df4"
if let unwrapUrl = url, elements = Optional.Some(unwrapUrl.characters.split("/")), last = elements.last where last.count > 5 {
    print(String(last))
}

猜你喜欢

转载自blog.csdn.net/qq_15623599/article/details/88969525