Tag: swift extensions

创build一个扩展来从Swift中的数组中过滤nils

我试图写一个扩展到数组,这将允许一个可选的T数组被转换成一个非可选的T数组。 例如,这可以写成这样一个免费的function: func removeAllNils(array: [T?]) -> [T] { return array .filter({ $0 != nil }) // remove nils, still a [T?] .map({ $0! }) // convert each element from a T? to a T } 但是,我不能把它作为一个扩展。 我试图告诉编译器,扩展只适用于可选值的数组。 这是我迄今为止: extension Array { func filterNils<U, T: Optional<U>>() -> [U] { return filter({ $0 != nil }).map({ $0! […]

Swift 2在协议扩展中使用变异函数的错误“不能在不可变的值上使用变异成员:'self'是不可变的

不知道这里发生了什么,这似乎应该是非常简单的。 我有一个可变的协议,一个带有变异函数的扩展。 当我试着在扩展中声明mtkAnimQueAppend时,事情在testClass.testFunc中出现,我得到这个错误: “不能在不可变的值上使用变异成员:'self'是不可变的。 protocol MTKAnimateValueDelegate { var mtkAnimQue:[MTKAnimateValue]? {get set} } extension MTKAnimateValueDelegate { ///Adds element to que mutating func mtkAnimQueAppend(element:MTKAnimateValue) { if mtkAnimQue != nil { mtkAnimQue?.append(element) } else { mtkAnimQue = [element] } } } class testClass: MTKAnimateValueDelegate { var mtkAnimQue:[MTKAnimateValue]? func testFunc() { var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: […]

在Swift中使用where子句扩展数组types

我想使用Accelerate框架来扩展[Float]和[Double],但是每个都需要不同的实现。 我试过很明显的: extension Array<Float> { } 并得到这个错误: “约束扩展必须在非专用genericstypes'Array'上声明,其约束由'where'子句指定” 以这种方式扩展Swift 2中的genericstypes是否可行? 我已经得到了代码正常工作。 以下是一个使用Accelerate框架显示总和的示例。 extension _ArrayType where Generator.Element == Float { func quickSum() -> Float { var result: Float = 0 if var x = self as? [Float] { vDSP_sve(&x, 1, &result, vDSP_Length(x.count)) } return result } } extension _ArrayType where Generator.Element == Double { func quickSum() […]

Swift 3.0:调用Array或Dictionary扩展中的全局func min <T>(T,T)时发生编译器错误

从Swift 2.2转换到3.0之后,我的Array扩展名不再编译,因为它包含对全局标准库函数min<T>(T,T) extra argument in call min<T>(T,T)并extra argument in call显示编译器错误的extra argument in call 。 这里有一个简单的方法来重现错误: extension Array { func smallestInt(first: Int, second: Int) -> Int { return min(first, second) // compiler error: "Extra argument in call" } } 当将相同的函数添加到Dictionary的扩展中时,我得到相同的错误,而完全相同的代码在其他types的扩展中编译得很好(例如String或AudioBuffer ): 看看Array和Dictionary的文档,我发现Sequence中有实例方法public func min() -> Element? 和public func min(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows […]