首页 > 解决方案 > 如何限制泛型函数以防止使用数组和字典?

问题描述

有什么方法可以防止调用者通过约束或代码检查将数组或字典传递给这个函数?

internal class Decoder {

    func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T {
        let decoder = try _Decoder(data: data)
        return try T(from: decoder)
    }

}

标签: swift

解决方案


您可以像这样进行约束T

 func decode<T: Decodable>(_ type: T.Type,
                             from data: Data) throws -> T where T: AnyObject {
            let decoder = try _Decoder(data: data)
            return try T(from: decoder)
    }

这样,Xcode 就不会让您将数组传递给该函数。但是您可能希望将自定义协议或类作为通用约束传递,因为AnyObject您将无法传递结构。

我的建议是您创建(如果您还没有)自定义Decodable协议并将其作为T约束传递:

protocol ModelProtocol: Codable {}

class BaseModel: ModelProtocol {

}

struct Model: ModelProtocol {

}

func decode<T: ModelProtocol>(_ type: T.Type, from data: Data) throws {
    let decoder = try _Decoder(data: data)
    return try T(from: decoder)
}

这样你就会得到你需要的东西

let baz = try? decode(BaseModel.self, from: data)
let bar = try? decode(Model.self, from: data)
let foo = try? decode([Model].self, from: data) 
//Instance method 'decode(_:from:)' requires that '[Model]' conform to 'ModelProtocol'

推荐阅读