首页 > 解决方案 > 崩溃专用 String.imageSize(),

问题描述

我在以下扩展方法中崩溃了String

    func imageSize() -> CGSize {
//        self = "https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2018-8-6/524x334-1_-E7VSb5T20mOouX.jpg"

        var width = 0
        var height = 0

        let split0 = self.split(separator: "/")
        if split0.count > 0 {
            let split1 = split0.last?.split(separator: "-")
            if (split1?.count)! > 0 {

                let split2 = split1?.first?.decomposedStringWithCanonicalMapping.split(separator: "x")

                width = (split2?.first?.decomposedStringWithCanonicalMapping.toInt())!

                if (split2?.count)! > 1 {
//                    let split2 = split1![1].decomposedStringWithCanonicalMapping.split(separator: "-")
                    height = (split2?.last?.decomposedStringWithCanonicalMapping.toInt())!
                }
            }
        }

        return CGSize(width: width, height: height)
    }

崩溃上线了return CGSize(width: width, height: height)

我创建了一个NSString这样的版本来使用上述相同的方法:

@objc extension NSString {
    func imageSize1() -> CGSize {
        return (self as String).imageSize()
    }
}

然后从 obj-c 代码中调用它:

CGSize imageSize = [url imageSize1];

网址示例如下:

https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2019-02-07/675x900-1_-CdC62Y2hcV7208.jpg

https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2019-02-07/675x900-1_-697e3no8ec2E1I.jpg

https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2019-02-07/675x900-1_-8Af5D20wh9b62z.jpg

imageSize()方法的作用是从 url 解析图像大小。上面的 url 包含大小 675x900 -> widthxheight。

在极少数情况下,我们会遇到没有大小信息且 url 不是上述格式的 url。因此,如果未找到大小,CGSize = (0 , 0)则返回。

我已经在所有预期的情况下测试了这种方法。但由于某些原因,该方法导致崩溃。可能是我错过/弄乱了一些东西。

这是 Crashlytics问题的链接。

任何帮助,将不胜感激。

标签: iosobjective-cswift

解决方案


崩溃很可能是由于强制展开选项造成的。在您的代码中有几种使用它的情况,如果您的 URL 中的文件名与您预期的格式不同,这将导致运行时错误。尝试

func imageSize() -> CGSize {
    // self = "https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2018-8-6/524x334-1_-E7VSb5T20mOouX.jpg"

    var width = 0
    var height = 0

    let split0 = self.split(separator: "/")
    if let split1 = split0.last?.split(separator: "-")
    {
        if let split2 = split1.first?.decomposedStringWithCanonicalMapping.split(separator: "x")
        {
            width = (split2.first?.decomposedStringWithCanonicalMapping.toInt()) ?? 0
            if split2.count > 1 {
                height = (split2.last?.decomposedStringWithCanonicalMapping.toInt()) ?? 0
            }
        }
    }

    return CGSize(width: width, height: height)
}

推荐阅读