Сбой специализированный String.imageSize (), - PullRequest
0 голосов
/ 07 февраля 2019

У меня сбой в этом методе расширения 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];

Примеры URL:

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 выпуск .

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Старайтесь не применять принудительную распаковку !

let exampleString1 = "https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2018-8-6/524x334-1_-E7VSb5T20mOouX.jpg"
let exampleString2 = "https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2019-02-07/675x900-1_-697e3no8ec2E1I.jpg"
let exampleString3 = "https://s3-eu-west-1.amazonaws.com/mimg.haraj.com.sa/userfiles30/2019-02-07/675x900-1_-CdC62Y2hcV7208.jpg"

extension String {
    func imageSize() -> CGSize? {
        // last url component
        guard let imageName = self.split(separator: "/").last else { return nil }
        guard let imageSizeString = imageName.split(separator: "-").first else { return nil }
        let sizes = imageSizeString.split(separator: "x")
        guard let first = sizes.first,
            let last = sizes.last,
            let wight = Int(String(first)),
            let height = Int(String(last))
        else { return nil }

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

exampleString1.imageSize() // Optional((524.0, 334.0))
exampleString2.imageSize() // Optional((675.0, 900.0))
exampleString3.imageSize() // Optional((675.0, 900.0))

Также попробуйте использовать guard let и вернуть nil, если что-то не так.Например, схема URL может быть изменена

0 голосов
/ 07 февраля 2019

Сбой, скорее всего, вызван принудительным развертыванием опций.В вашем коде есть несколько случаев, когда вы его используете, что приведет к ошибке времени выполнения, если имя файла в вашем 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)
}
...