Could not find member <method name> for struct type in Swift

落花浮王杯 提交于 2019-12-11 11:43:46

问题


I have the following code but when I try to chain using the following x.initial(2).flatten() I get a compile error saying Could not find member flatten

What am I doing wrong. To make sure I can keep chaining I am returning self after each chained method such as flatten, initial, etc.

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

回答1:


It is because initial returns an immutable instance of $. You are then trying to call a mutating method (flatten) on it. In order to mutate it again, you will have to store it in another variable that can be mutated. You could also change it to be a class instead of a struct because classes are mutable.

Note currently, the error message you are getting is terrible, but that is life with Swift at the moment.



来源:https://stackoverflow.com/questions/24175774/could-not-find-member-method-name-for-struct-type-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!