gpt4 book ai didi

ios - 为类型化数组创建快速数组扩展

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:43 25 4
gpt4 key购买 nike

这个问题 ( Create swift array extension for typed arrays [duplicate] ) 非常接近回答这个问题,但是这个问题中正在做的事情可以是通用的。

这个问题 ( How can I extend typed Arrays in Swift? ) 也很接近,但不是同一个问题,因为示例没有将扩展限制为特定类型的数组。

假设我有一个 UIView 数组。

[node, node1, node2]

我想给它添加一个 extension func ,比如:

[node, node1, node2].hideAll()

extension UIView {
func hide() { self.hidden = true }
}

extension Array {
func hideAll() {
for node in self { (node as! UIView).hide() }
}
}

除了包含类型为 UIView 的对象的数组外,我不希望访问 hideAll()。我可以以及如何限制它吗?

最佳答案

你可以试试这样的:

protocol ShyObject : AnyObject {
var hidden: Bool { get set }
}

extension SequenceType where Generator.Element : ShyObject {
func hideAll() { for e in self { e.hidden = true } }
func showAll() { for e in self { e.hidden = false } }
}

import UIKit

extension UIView : ShyObject {}
// TODO: extend more shy types...

let nodes = Array(count: 5, repeatedValue: UIView())
nodes.hideAll()

如果您还特别需要hide() 方法,您可以为所有ShyObject 通用地提供它:

extension ShyObject {
func hide() { hidden = true }
func show() { hidden = false }
}

并为没有hidden的类型实现一致性:

class MyClass {}

extension MyClass : ShyObject {
var hidden: Bool {
get { return /* true or */ false }
set { /* hide me or show me */ }
}
}

let myObjects = Array(count: 5, repeatedValue: MyClass())
myObjects.hideAll()

我们也可以有 allHiddenallShown 属性:

extension SequenceType where Generator.Element : ShyObject {
var allShown: Bool { return !contains{ $0.hidden == true } }
var allHidden: Bool { return !contains{ $0.hidden == false } }
}

extension MutableCollectionType where Generator.Element : ShyObject {
var allShown: Bool {
get { return !contains{ $0.hidden == true } }
set { newValue ? showAll() : hideAll() }
}
var allHidden: Bool {
get { return !contains{ $0.hidden == false } }
set { newValue ? hideAll() : showAll() }
}
}

var nodes = Array(count: 5, repeatedValue: UIView()) // note the `var` :(

nodes.allShown = false
nodes.allHidden // true (does not in itself require a mutable collection!)

... 这可行,但它有一个主要缺点,即如果我们想使用 setter,序列必须是可变的。这是因为所有带有 setter 的计算属性都被编译器假定为 mutating,即使序列元素是像这里这样的引用类型......仍然,我们至少可以只有 getter allShownallHidden 属性,无需为可变性付费。

请注意,正如@dfri 曾评论过的那样,这个答案比问题明确要求的更笼统。如果不需要,@dfri 建议:

protocol Hideable {
func hide()
}

extension UIView : Hideable {
func hide() { self.hidden = true }
}

extension Array where Element: Hideable {
func hideAll() { for e in self { e.hide() } }
}

关于ios - 为类型化数组创建快速数组扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com