Swift - если строка ноль. не добавляйте его в массив - PullRequest
0 голосов
/ 03 июля 2018

У меня есть Array из Image ссылок -

let alamofireSource = [AlamofireSource(urlString: Img1!)!, AlamofireSource(urlString: Img2!)!,
AlamofireSource(urlString: Img3!)!, AlamofireSource(urlString: Img4!)!]
slideshow.setImageInputs(alamofireSource)

некоторые сообщения имеют только одно изображение, два или три, и так далее. поэтому иногда изображение 2 (например) имеет значение nil. В таком случае я не хочу, чтобы оно добавлялось в массив, возможно ли это?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

так, иногда изображение 2 (например) ноль, в этом случае я не хочу это будет добавлено в массив, это возможно?

Да, это так. Хотя я бы согласился с предложением Ш_Кхана использовать метод compactMap для его достижения, но для вашего текущего случая это было бы бесполезно:

Исходя из вашего фрагмента кода, я бы предположил, что alamofireSource типа [AlamofireSource], но не [AlamofireSource?], и это потому, что вы принудительно разворачиваете его элементы ( добавив ! к каждому из его элементов). Пока что alamofireSource не содержит nils (на самом деле это может быть опаснее, чем просто объявление, ваше приложение может зависнуть!)

Итак, прежде всего, я бы порекомендовал удалить ! из alamofireSource:

let alamofireSource = [AlamofireSource(urlString: Img1!),
                       AlamofireSource(urlString: Img2!),
                       AlamofireSource(urlString: Img3!),
                       AlamofireSource(urlString: Img4!)]

, что означает, что пусть это будет [AlamofireSource?], поэтому вы получите выгоду от использования compactMap(_:):

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

Как:

let alamofireSourceWihoutNils = alamofireSource.compactMap { $0 }
0 голосов
/ 03 июля 2018

Если вы поместите свои Optional строки url в массив, скажем urlStrings (типа [String?]), вы можете построить alamofireSource в соответствии с ( Swift 4 ):

let alamofireSource = urlStrings.compactMap { $0.map(AlamofireSource.init) }

Которые используют оператор map(_:) Optional и compactMap(_:) для развертывания двухуровневой опции.

Подробнее

Ваш пример содержит два уровня необязательности:

  • Необязательные ImgX аргументы типа String? - далее именуемые img1, ..., img4, так как CapitalFirstLetter имена зарезервированы, например, для. типы, не тип экземпляры .
  • Отказавший инициализатор init?(urlString: String, placeholder: UIImage? = nil) из AlamofireSource.

Прежде всего, давайте соберем необязательные ссылки на изображения (imgX) в массив

let urlStrings = [url1, url2, url3, url4] // [String?]

Swift 4

Вы можете объединить оператор map(_:) Optional с compactMap(_:), чтобы безопасно развернуть и использовать .some entires urlStrings, после чего собрать успешные вызовы сбойного инициализатора AlamofireSource:

let alamofireSource = urlStrings.compactMap { $0.map(AlamofireSource.init) }

// or, use a named closure argument
let alamofireSource = urlStrings.compactMap { str in str.map(AlamofireSource.init) }

Swift 3

При использовании Swift 3 замените приведенный выше вызов compactMap(_:) на flatMap(_:):

let alamofireSource = urlStrings.flatMap { $0.map(AlamofireSource.init) }

// or, use a named closure argument
let alamofireSource = urlStrings.flatMap { str in str.map(AlamofireSource.init) }
0 голосов
/ 03 июля 2018

Можно попробовать ( Swift 4 )

let arr = [img1,img2].compactMap{$0}.map{AlamofireSource(urlString:$0)!}

или

let arr = alamofireSource.compactMap{$0}

для Swift 3

let arr = alamofireSource.flatMap{$0}
...