2015-12-30 44 views
3

我有一个4数组segmentedControl属性fontSize,我想一次为所有4个元素设置这个属性的值。快速使用map来设置属性

通常情况下,我想这个循环转变为一个独特的句子:

// 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) 
    } 

请注意,它几乎是你在代码中写的东西。所以,这里最重要的是使用像map,filter,reduce和forEach这样的高阶函数的真正好处不一定是性能。这是通过消除样板代码而获得的简洁。使用更高阶的函数,您可以更快地获得点,同时还能生成可读代码。

在我的测试中,性能差异可以忽略不计。

+0

谢谢您的详细解释!我不知道forEach,它就像一个魅力! – Nahouto

+0

当我发现它时,我很惊讶。我认为这是为了让快速开发人员可以使用更高阶的函数编写更多简洁的代码。很高兴它解决了! –

+0

它也可能比循环更有效率,不是吗? – Nahouto