gpt4 book ai didi

arrays - swift 数组 : Cannot invoke 'append' with an argument list of type '(Int)'

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:10 25 4
gpt4 key购买 nike

我正在尝试为数组实现一个填充函数:

extension Array {
func dataWithPadding(offset: Int, length: Int, paddingLength: Int) -> NSData {
var arr = Array(self[offset..<(offset + length)])
arr = arr.reverse()
for (var i = 0; i < paddingLength; i++) {
arr.append(0)
}
let d = NSData(bytesNoCopy: &arr, length: length)
return d
}
}

此错误在 arr.append 处:

Cannot invoke 'append' with an argument list of type '(Int)'

我尝试将声明更改为:

var arr[UInt8] = Array(self[offset..<(offset + length)])

但是,这也会出错:

Cannot assign to immutable expression of type '[UInt8].Type' (aka 'Array.Type')

奇怪的部分:我尝试运行原始代码,将 arr.append 注释掉,然后使用 lldb 直接运行 arr.append(0) ,它确实有效。

我正在使用 Xcode 7.2。

最佳答案

由于您的 Array 扩展没有限制可与其一起使用的数组类型(元素类型),因此无法调用 .append(0);并非所有类型都可以从整数文字转换为。因此,您不能在“通用”数组扩展中使用 .append(0) 并不奇怪,而您自然可以直接在 Swift 可以推断具有整数文字可转换元素的数组上使用它,例如[整数]。考虑以下示例:

var arr : [UInt8] = []
arr.append(0)

var arr2 : [String] = []
arr2.append(0) // error

在上面的例子中,两个数组都可以访问你的扩展dataWithPadding,但它们自然不能在扩展中使用arr.append(0),因此错误消息

Cannot invoke 'append' with an argument list of type '(Int)'

现在,一个简单的解决方法是将数组元素的类型约束添加到 IntegerLiteralConvertible ,之后您的扩展有效,并且所有具有符合 IntegerLiteralConvertible 的元素的数组都可以访问。

extension Array where Element: IntegerLiteralConvertible {
func dataWithPadding(offset: Int, length: Int, paddingLength: Int) -> NSData {
var arr = Array(self[offset..<(offset + length)])
arr = arr.reverse()
for (var i = 0; i < paddingLength; i++) {
arr.append(0)
}
let d = NSData(bytesNoCopy: &arr, length: length)
return d
}
}

或者,使用不太通用的 SignedNumberType , UnSignedIntegerTypeIntegerType作为 Element 的类型约束;这些也符合例如ComparableEquatable,如果您想比较扩展中的通用元素并对其执行操作。


最后请注意,您可以自然地使用自己的自定义协议(protocol)作为扩展中 Element 的类型约束,从而允许您包含其他蓝图(下面的 foo() 方法) 可用于扩展中的 Element:s

protocol MyIntegerLiteralInitializableTypes: IntegerLiteralConvertible {
func foo()
}
extension MyIntegerLiteralInitializableTypes {
func foo() {
print("I am of type \(self.dynamicType)!")
}
}

/* For the Array<Type>:s you want to have access to .dataWithPadding,
extend those 'Type':s to MyIntegerLiteralInitializableTypes */
extension Int8 : MyIntegerLiteralInitializableTypes { }
extension UInt8 : MyIntegerLiteralInitializableTypes { }

extension Array where Element: MyIntegerLiteralInitializableTypes {
func dataWithPadding(offset: Int, length: Int, paddingLength: Int) -> NSData {

self.first?.foo() /* I am of type ...! */

var arr = Array(self[offset..<(offset + length)])
arr = arr.reverse()
for (var i = 0; i < paddingLength; i++) {
arr.append(0)
}
let d = NSData(bytesNoCopy: &arr, length: length)
return d
}
}

@warn_unused_result 添加到您的 dataWithPadding(...) 函数签名中也可能是个好主意,因为调用它而不分配返回值将产生一个运行时异常(“... malloc:...:未分配正在释放的指针”)。

关于arrays - swift 数组 : Cannot invoke 'append' with an argument list of type '(Int)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35152204/

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