2015-12-30 3 views
3

У меня есть 4-сегментный сегментированный элемент управления с свойством fontSize, и я хочу установить значение этого свойства для всех четырех элементов одновременно.Быстрое использование карты для установки свойства

Как правило, я хочу, чтобы преобразовать эту петлю к уникальному предложению:

// set identic font size for all segments (first, get the minimum font size and then set it for all segments) 
let minimumSize = (segmentedControlAnimated.segments.map{$0.titleLabel!.fontSize}).minElement() 
for i in 0..<segmentedControlAnimated.segmentContent.text.count { 
    segmentedControlAnimated.segments[i].titleLabel!.font = UIFont(name: "HelveticaNeue-Medium", size: minimumSize!) 
} 

Может ли вы помочь мне сделать это?

Спасибо, и извините за мой плохой английский ...

ответ

2

Ваше первое использование карты в порядке, так как ваш массив очень мало, и вы желание создать новый массив, чтобы затем извлечь minElement().

Однако, что касается вашего второй задачи не использовать карту только, чтобы установить свойство. Помните, что .map создает совершенно новый объект, который заменяет ваш оригинал. Что-то вроде .forEach было бы более подходящим, так как оно обновляет ваш оригинальный объект.

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

  • Используйте .forEach, когда вам просто нужно сменить недвижимость кучей предметов.

я должен был бы видеть больше вас кода, чтобы знать наверняка, но в теории, что-то, как это должно работать, чтобы обновить вашу собственность:

segmentedControlAnimated.segments.forEach { item in 
    return item.titleLabel!.font = UIFont(name: "HelveticaNeue-Medium", size: minimumSize!) 

} 

или

segmentedControlAnimated.segments.forEach { return $0.titleLabel!.font = UIFont(name: "HelveticaNeue-Medium", size: minimumSize!) } 

Подробнее на основе комментариев:

Чтобы получить представление о различиях в производительности между традиционными функциями for-in и функциями более высокого порядка, такими как .map, посмотрите на функцию карт Swifts, определенную в стандартной библиотеке. (source)

public func map<T>(@noescape transform: (Generator.Element) throws -> T 
) rethrows -> [T] { 

    let initialCapacity = underestimateCount() 
    var result = ContiguousArray<T>() 
    result.reserveCapacity(initialCapacity) 

    var generator = generate() 

    // Add elements up to the initial capacity without checking for regrowth. 
    for _ in 0..<initialCapacity { 
     result.append(try transform(generator.next()!)) 
    } 
    // Add remaining elements, if any. 
    while let element = generator.next() { 
     result.append(try transform(element)) 
    } 
    return Array(result) 
    } 

Обратите внимание, что это в значительной степени то, что вы пишете в своем коде в любом случае. Таким образом, большой отрыв здесь заключается в том, что реальная выгода от использования функций более высокого порядка, таких как карта, фильтр, сокращение и forEach, не обязательно является производительностью. Это ограничение, которое вы получаете, устраняя шаблонный код. С функциями более высокого порядка вы быстрее достигаете точки, все еще создавая считываемый код.

В моих тестах разница в производительности незначительна.

+0

Благодарим вас за подробное объяснение! Я не знал, для кого-то, это работает как шарм! – Nahouto

+0

Я был удивлен, когда нашел его. Я думаю, что он был создан так, чтобы быстрые разработчики могли писать более сложный код, используя функции более высокого порядка. Рад, что это сработало! –

+0

он также может быть более эффективным, чем цикл, нет? – Nahouto

Смежные вопросы