Стоит ли указывать определенные свойства для IE или просто для других более старых версий? [Обратная совместимость]

С Swift 4 Array имеет два метода, называемых sorted() и sorted(by:) . Первый метод sorted() имеет следующее объявление:

Возвращает элементы коллекции, отсортированные.

blockquote>
func sorted() -> [Element]

Второй метод, sorted(by:) имеет следующее объявление:

Возвращает элементы коллекции, отсортированные с использованием заданного предиката в качестве сравнения между элементами.

blockquote>
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]

1. Сортировка по возрастанию для сопоставимых объектов

Если тип элемента внутри вашей коллекции соответствует протоколу Comparable, вы сможете использовать sorted() для сортировки ваших элементов с возрастающим порядком. Следующий код игровой площадки показывает, как использовать sorted():

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted()
print(sortedImages)

/*
 prints: [ImageFile with ID: 100, ImageFile with ID: 200, ImageFile with ID: 300]
 */

2. Сортировка по убыванию для сопоставимых объектов

Если тип элемента внутри вашей коллекции соответствует протоколу Comparable, вам нужно будет использовать sorted(by:), чтобы сортировать ваши элементы с убывающим порядком.

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0 > img1
})
//let sortedImages = images.sorted(by: >) // also works
//let sortedImages = images.sorted { $0 > $1 } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

3. Сортировка по возрастанию или убыванию для несопоставимых объектов

Если тип элемента внутри вашей коллекции НЕ соответствует протоколу Comparable, вам придется использовать sorted(by:), чтобы отсортировать элементы с возрастанием или убывающий порядок.

class ImageFile: CustomStringConvertible {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

Обратите внимание, что Swift также предоставляет два метода, называемых sort() и sort(by:) , в качестве копий sorted() и sorted(by:), если вам нужно сортировать свою коллекцию на месте.

6
задан NeonNatureEX 11 April 2019 в 07:21
поделиться

3 ответа

Вы не должны беспокоиться о браузерах, более старых, чем IE 8. Эти браузеры почти не используются, и они не поддерживают много вещей. Пожалуйста, обратитесь к этим сайтам:

https://imagebox.com/industry/why-your-website-doesnt-look-the-same-in-every-browser/ http://dowebsitesneedtolookexactlythesameineverybrowser.com/ .

С точки зрения различных команд border-radius, убедитесь, что используете их все. Я обнаружил, что если вы не включите webkit и mozilla, вы потеряете много трафика. На моем веб-сайте я обычно включаю все варианты команд, поэтому я точно знаю, что мой веб-сайт работает. Лучше иметь большой и некрасивый код CSS, чем сломанный сайт.

Не стесняйтесь комментировать этот ответ, если вам нужно больше разъяснений.

0
ответ дан Calvin Haworth 11 April 2019 в 07:21
поделиться

Ну ... Это действительно большая тема, поэтому на нее трудно ответить, но есть лучшие практики, которым вы должны / могли бы следовать.

Сначала - Все основано на ВАШЕЙ КОНКРЕТНОЙ аудитории. Посмотрите на свою аналитику и посмотрите, какие браузеры используются. Эти данные могут вас удивить, особенно если вы пользуетесь услугами здравоохранения или государственных учреждений США. Такие инструменты, как Stylelint , помогут вам найти неподдерживаемые правила в вашем CSS.

Далее, рекомендуется использовать функцию обнаружения вместо нацеливания на определенные браузеры. Вы можете реализовать это, используя @supports в условном коде, который работает как media query. Таким образом, ваш код применяется только в том случае, если браузер может его использовать. Вы можете сделать подобное обнаружение в JavaScript, используя Modernizr .

Наконец, я лично рекомендую использовать постпроцессор CSS или скрипт сборки, чтобы вы могли перестать беспокоиться о префиксах (плюс это ускорит вашу разработку с помощью дополнительных плагинов). Мне нравится комбо из PostCSS и Prefixfree (несколько настроек Webpack поставляются с включенными), но есть много похожих вариантов.

Основным преимуществом является то, что библиотека отслеживает то, что требует префиксов, а что нет, поэтому вы пишете версию без префиксов, а обо всем остальном позаботятся.


Нет жестких и быстрых правил, но вы должны стараться поддерживать устройства своих пользователей, а не настаивать на обновлениях. Хорошая вещь в вышеупомянутых практиках состоит в том, что ваш результирующий код будет легче поддерживать, он будет ориентирован на будущее и предназначен для ваших пользователей.

0
ответ дан Bryce Howitson 11 April 2019 в 07:21
поделиться

Вот мои мысли - прежде чем углубляться в детали, я должен сказать, что я ненормальный, когда дело доходит до поддержки браузера.

До тех пор, пока пару лет назад я не пытался поддерживать IE8 и выше. Причиной этой логики было то, что люди, которые «оказались в ловушке» с Windows XP и IE8, были последней версией, поддерживаемой Windows XP. Под ловушкой я подразумеваю, что это были случаи, подобные правительственным, которые были слишком дорогостоящими для модернизации.

После того, как Windows 7 достаточно повзрослела и использование Windows XP упало, я попытался поддерживать IE9 и выше. По сути это означало, что даже после того, как появились полезные свойства (например, flexbox), у меня ушло много времени на миграцию - поэтому я строил макеты с таблицами для лучшей поддержки браузера и т. Д.

Однако, Javascript Frameworks начал отказываться от поддержки старых браузеров (включая IE9), затем CSS-структуры начали отказываться от поддержки. Если вы подумаете об этом некоторое время назад, сама MS уже давно отказалась от поддержки. Крупные мобильные компании отказываются от поддержки своих двухлетних устройств, так почему мы должны поддерживать старые браузеры? Как указано в других ответах, это зависит от аудитории - представьте, что генеральный директор вашей лучшей компании-клиента имеет ноутбук с Windows XP или другим устаревшим устройством - не будет иметь значения, если кто-то еще использует современные браузеры ...

Итак, пару лет назад пришло время выбирать, следовать ли за потоком, быть современным или поддерживать старые устройства. Я полностью поддерживаю последовательность и единообразие контента, поэтому поддержка современных функций для некоторых избранных браузеров и отбрасывание их для других была бы бесполезной для меня. Flexbox был одним из тех свойств, которые подтолкнули меня к отказу от поддержки старых браузеров - это значительно помогло мне уменьшить разметку - тем самым упростив обслуживание. В то же время, даже Bootstrap решил отказаться от поддержки старых браузеров, поэтому должен обновиться, чтобы идти в ногу с конкурентами.

Излишне говорить, что проблема не только в IE, но и в Android, который поднялся до версии 4.4, чтобы стандартный браузер поддерживал определенные свойства - vh, flexbox wrapping и т. Д.

сказал: позвольте мне дать вам прямой ответ:

  • Не беспокойтесь о поддержке IE9 - даже 10. IE10 может быть обновлен до 11 на той же ОС, так что должно быть обновлен в любом случае по соображениям безопасности. IE9 не поддерживается фреймворками JS (например, Ember), в нем отсутствуют переходы CSS3 и другие полезные свойства, такие как flexbox. Без этого ваши проекты должны были бы сделать много шагов назад, если бы вы стремились к согласованности дизайна.

  • Как sidenote, IE10 начал поддерживать свою собственную интерпретацию flexbox (извините за все это постоянство с flexbox, но это одно из самых полезных свойств). Это означает, что для правильной его поддержки вам придется написать много CSS. Представьте себе добавление 30 КБ минимизированного CSS для поддержки только одного браузера, который является довольно редким. Стоит ли это того?

  • Некоторым браузерам веб-пакетов (например, Opera) все еще могут требоваться специфичные для поставщика префиксы для версий браузера, выпущенных 4 года назад, например, для преобразований CSS3. Более важные вещи ломаются в таких браузерах (включая Opera), что я бы больше беспокоился о других вещах. Лично я использую префикс -webkit- только в некоторых случаях (например, свойства flexbox, которые появились в последнее время).

  • В некоторых случаях префиксы, специфичные для браузера, могут оказаться полезными даже в современных браузерах, например, для стилизации ввода диапазона или полосы прокрутки, где вам нужно связываться со свойствами, специфичными для браузера, для достижения согласованности. В таких случаях могут потребоваться специальные CSS-хаки с префиксами вендоров.

В качестве последнего замечания, я бы избегал любых передовых свойств, например, сетки; узнайте, что он делает и как он работает, но пока не используйте его. Вы должны взглянуть на https://caniuse.com/ , чтобы иметь представление о свойствах CSS и поддержке браузера.

Тем не менее, вам решать, и вы должны сделать свой выбор на основе требований вашего проекта. Два года назад я бы посоветовал вам поддерживать столько, сколько вы можете ... тогда вы могли бы достичь одних и тех же целей с разными усилиями, но это уже не так. С самого начала ... старые браузеры не могут идти в ногу.

0
ответ дан scooterlord 11 April 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: