Swift通用类

时间:2015-03-30 07:52:38

标签: ios swift

我有一个这样的课程

// a.swift
public class ComServiceString<Result>: ComService<Result> {    
    override func execute() {
        if (method == Method.GET) {
            manager.GET(getUrl(),
                parameters: nil,
                success: { (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
                    self.onSuccessListener?(self.parseResult(responseObject.description))
                },
                failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
                    println("Error: " + error.localizedDescription)
                    var errorSd = ComServiceError(error.localizedDescription)
                    if (operation.response != nil) {
                        errorSd.errorCode = operation.response.statusCode
                    }
                    self.onFailedListener?(errorSd)
                }
            )
        }
    }

    func parseResult(result: String) -> Result? {
        fatalError("This method need to be implemented")
    }
}

我将它扩展到像这样的新类

// b.swift:
public class BranchListService<T>: ComServiceString<BranchListModel> {

    override func parseResult(result: String) -> BranchListModel? {
        let branchListMode = BranchListModel(stringResult: result)
        return branchListMode
    }
}

我的BranchListModel看起来像这样

public class BranchListModel {
    public var total = 0
    public var stringResult = ""

    init() {}

    init (stringResult result: String) {
        self.stringResult = result
        if let jsonArray = JSONUtil.stringToJSONArray(result) {
            if let resultObject = jsonArray[0] as? NSDictionary {
                if let total = resultObject["total"] as? NSString {
                    self.total = total.integerValue;
                }
            }
        }
    }
}

但我在此行中出现BAD_ACCESS错误:

let branchListMode = BranchListModel(stringResult: self.resultString)

parseResult上的b.swift内部功能。我仍然在尝试将java代码转换为swift时学习此语言。你们知道代码中有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我认为Swift编译器存在一个错误。我在下面测试了一个相对简化的代码,并以同样的方式崩溃。

class ResultParser<T> {
    func parse(result: String) -> T? { abort() }
}

class MyResultParser<T>: ResultParser<Int> {
    override func parse(result: String) -> Int? {
        return result.toInt()
    }
}

let parser: ResultParser<Int> = MyResultParser<()>()
parser.parse("2525")

目前,Swift编译器无法正确处理直接接收和/或返回其类型为通用值的虚函数。我想编译器将T视为指针(对象)值,无论实际的替换类型是什么。

我找到了一种解决方法,几乎​​可以做同样的事情。

class Box<T> {
    let raw: T
    init(_ raw: T) { self.raw = raw }
}

class ResultParser<T> {
    func parse(result: String) -> Box<T?> { abort() }
}

class MyResultParser<T>: ResultParser<Int> {
    override func parse(result: String) -> Box<Int?> {
        return Box(result.toInt())
    }
}

在上面的代码中,返回的值包含在Box<>中。 Box<>是一个对象,因此无论编译器是否可以从对象类型中分辨值类型,它都可以工作。