swift - 数组的通用扩展不起作用

标签 swift generics swift-extensions

我一直在研究 Swift 3 中现有类型的泛型和扩展。我编写了两个通用 Array 函数,它们使用名为 replaced() 和 replace() 的查找和替换方法扩展 Array。 replaced() 函数按预期工作,但 replace() 函数有编译时错误。这是其中一种方法的代码和测试。

extension Array {
    func replaced<T: Equatable>(each valueToReplace: T, with newValue: T) -> [T] {
        var newArray:[T] = []
        for index:Int in 0..<self.count {
            if let temp = self[index] as? T, temp == valueToReplace{
                newArray.append(newValue)
            }else{
                newArray.append(self[index] as! T)
            }
        }
        return newArray
    }
    mutating func replace<T: Equatable>(each valueToReplace: T, with newValue: T) {
        for index:Int in 0..<self.count {
            if let temp = self[index] as? T, temp == valueToReplace {
                // FIXME: self[index] = newValue 
            }
        }
        return
    }
}
var j = [1,2,3,4,3,6,3,8,9]
var newArray = j.replaced(each: 3, with: 0)

在用“//FIXME:”注解注释掉的行中,我在第二种方法 replace() 上遇到编译时错误。编译时错误显示,“对成员‘下标’的引用不明确”。

如何修复 replace() 代码使其正常工作?

最佳答案

试一试

extension Array where Element: Equatable {
    func replaced (each valueToReplace: Element, with newValue: Element) -> [Element] {
        var newArray = [Element]()
        newArray.reserveCapacity(self.count)

        for element in self {
            let newElement = (element == valueToReplace) ? newValue : element
            newArray.append(newElement) 
        }

        return newArray
    }

    mutating func replace(each valueToReplace: Element, with newValue: Element) {
        for (i, element) in self.enumerated() {
            if element == valueToReplace { self[i] = newValue }
        }
    }
}

var j = [1,2,3,4,3,6,3,8,9]
var newArray = j.replaced(each: 3, with: 0)

最好通过将 replaced 委托(delegate)给 replace 来消除冗余:

extension Array where Element: Equatable {
    func replaced(each valueToReplace: Element, with newValue: Element) -> [Element] {
        var copy = self
        copy.replace(each: valueToReplace, with: newValue)
        return copy
    }

    mutating func replace(each valueToReplace: Element, with newValue: Element) {
        for (i, element) in self.enumerated() {
            if element == valueToReplace { self[i] = newValue }
        }
    }
}

关于swift - 数组的通用扩展不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42706956/

相关文章:

ios - 从字符串( View Controller 字符串名称)创建 UIViewController 类实例而不使用 Storyboards 或 NIB/XIB?

java - 是否可以打包通用类?

ios - 仅在符合特定协议(protocol)时才对类进行 Swift 扩展

swift - 静态协议(protocol)扩展生成非法指令编译器错误

ios - 在快速给出错误时初始化字典数组

Swift 3 可选展开

java - List<List<String>> 是 Collection<Collection<T>> 的实例吗?

swift - 在 Swift 中返回实例类型

ios - 在 swift 数据模型中使用来自 objective-c++ 框架的数据类型

java - 列表<?之间的区别扩展 MyClass> 和 List<MyClass>