我有一个这样的课程
// 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
时学习此语言。你们知道代码中有什么问题吗?
答案 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<>
是一个对象,因此无论编译器是否可以从对象类型中分辨值类型,它都可以工作。