我有以下代码但是当我尝试使用以下x.initial(2).flatten()
链接时,我收到编译错误Could not find member flatten
我做错了什么。为了确保我可以继续链接,我会在每个链接方法(如flatten,initial等)后返回自我。
struct $ {
var resultArray: AnyObject[] = []
init(array: AnyObject[]) {
self.resultArray = array
}
mutating func first() -> AnyObject? {
return $.first(self.resultArray)
}
mutating func flatten() -> $ {
self.resultArray = $.flatten(self.resultArray)
return self
}
static func first(array: AnyObject[]) -> AnyObject? {
if array.isEmpty {
return nil
} else {
return array[0]
}
}
mutating func initial() -> $ {
return self.initial(1)
}
mutating func initial(numElements: Int) -> $ {
self.resultArray = $.initial(self.resultArray, numElements: numElements)
return self
}
func value() -> AnyObject[] {
return self.resultArray
}
static func flatten(array: AnyObject[]) -> AnyObject[] {
var resultArr: AnyObject[] = []
for elem : AnyObject in array {
if let val = elem as? AnyObject[] {
resultArr += self.flatten(val)
} else {
resultArr += elem
}
}
return resultArr
}
static func initial(array: AnyObject[]) -> AnyObject[] {
return self.initial(array, numElements: 1)
}
static func initial(array: AnyObject[], numElements: Int) -> AnyObject[] {
var result: AnyObject[] = []
for (index, _) in enumerate((0..array.count - numElements)) {
result += array[index]
}
return result
}
}
var x = $(array: [[1, 2], 3, [[4]]])
var y = x.initial(2).flatten() //Throws the error
答案 0 :(得分:3)
这是因为initial
返回$
的不可变实例。然后,您尝试在其上调用变异方法(flatten
)。为了再次变异,你必须将它存储在另一个可以变异的变量中。您也可以将其更改为class
而不是struct
,因为类是可变的。
注意目前,您收到的错误消息很糟糕,但这就是Swift的生活。