我想用一个方法创建一个协议,该方法接受一个泛型输入并返回一个泛型值.

这是我到目前为止try 过的,但它会产生语法错误.

使用未声明的标识符T.

我做错了什么?

protocol ApiMapperProtocol {
    func MapFromSource(T) -> U
}

class UserMapper: NSObject, ApiMapperProtocol {
    func MapFromSource(data: NSDictionary) -> UserModel {
        var user = UserModel() as UserModel
        var accountsData:NSArray = data["Accounts"] as NSArray     
        return user
    } 
}

推荐答案

协议有点不同.看看"关联类型"in Apple's documentation.

这就是您在示例中使用它的方式

protocol ApiMapperProtocol {
    associatedtype T
    associatedtype U
    func MapFromSource(_:T) -> U
}

class UserMapper: NSObject, ApiMapperProtocol {
    typealias T = NSDictionary
    typealias U = UserModel

    func MapFromSource(_ data:NSDictionary) -> UserModel {
        var user = UserModel()
        var accountsData:NSArray = data["Accounts"] as NSArray
        // For Swift 1.2, you need this line instead
        // var accountsData:NSArray = data["Accounts"] as! NSArray
        return user
    }
}

Swift相关问答推荐

如何将趋势线添加到线性图中?

如何使用swift宏生成一个带有关联值的枚举?

如何将泛型函数存储到变量中?

减go 用SWIFT struct 填充的NSCountedSet

我在SwiftUI中的动画无法正常工作

按下一步后无法让文本字段切换焦点

声明一个协议时使用和不使用任何单词有什么区别?

当将新值推送到 NavigationStack 时,SwiftUI 的 navigationDestination 已在堆栈的早期声明

在 RealityKit 中查找特定模型的 findEntity(named:) 方法的替代方法?

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

如何在 SWIFTUI 中旋转修剪?

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

如何让 UIKit 挤压你的视图,使其适合屏幕

阻止其他类型的键盘

如果没有标记,则为 Swift 预处理器

如何删除桥头而不出错?

不支持用作符合协议 AnyObject 的具体类型

Swift if 语句 - 多个条件用逗号分隔?

如何在 iOS 上的 Swift 中获取 sharedApplication?