我必须将一个协议作为参数传递给一个函数。协议是泛型的,具有关联的类型。我找不到一个好办法。
我想要实现的基本上是在JSON中存储一个键值对。所以我有一个通用的数据类型协议,它设置/获取值(根据数据类型设置和获取)
在另一个协议中,我希望将这个泛型数据类型协议作为函数参数传递。
protocol Datatype {
associatedtype dataType
func get(json: JSON) -> dataType?
func set(json:inout JSON, key: String, value: dataType)
}
class DatatypeString: Datatype{
typealias dataType = String
func get(json: JSON) -> dataType? {
return json.stringValue
}
func set(json: inout JSON, key: String, value: dataType) {
json[key] = JSON(value)
}
}
class DatatypeInt: Datatype{
typealias dataType = Int
func get(json: JSON) -> Int? {
return json.intValue
}
func set(json: inout JSON, key: String, value: Int) {
json[key] = JSON(value)
}
}
在下面的代码中,我得到的协议“dataType”只能用作泛型约束,因为它有自身或关联的类型要求
protocol Final {
func set<T>(key: String, type: Datatype ,value: T) //getting error
}
class A : Final {
var root:JSON = [:]
func set<T>(key: String, type: Datatype, value: T) {
type.set(json: &root, key: key, value: value)
}
class test {
let a = A()
let dataType = DatatypeString()
a.set("key",datatype, "VALUE")
}
必须使用dataType
作为泛型约束:
func set<T: Datatype>(key: String, type: T ,value: T.dataType)
请注意,您还需要将value
参数的类型更改为t.dataType
,以确保类型安全。也就是说,您传入的值必须是与type
参数的dataType
相同的类型。
问题内容: 在Objective-C中,我知道如何传递as参数: 但是在Swift中没有更多类型了。 如何在不知道是哪个的情况下将协议作为参数传递? 问题答案: 在您的评论之一中,您说: “我想创建一个方法,该方法返回实现所需协议的类类型的数组。” 您是否尝试过以下方法: 然后使用上述结构: 起作用的棘手部分是“ @objc”,它将协议暴露给目标c运行时,并允许我们传递任何“协议类型”作为参数。
假设我们有python中的函数: 虽然我可能会将传递给A,但我正在寻找一种优雅的方法来传递类似于的东西来执行。 我现在看到的唯一方法是发送一个函数列表并按顺序应用它们。有没有更好的办法?
最近我在使用c语言时遇到了一些问题,基本上是这样的: 在一个函数(比如intmain)中,我声明了一个变量Y=5,我有一个lambda函数,它接收一个值并将Y相加; 我的问题是:我需要将这个lambda函数传递给一个已经存在的函数,这样它就可以在另一个函数内部调用。 我尝试了几件事,但没有一个像我预期的那样工作(有些甚至不起作用): 另一个问题是我不能改变我的receives函数签名,因为代码的剩
问题内容: 在Objective- C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许符合的方法: 我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议,但是您又如何要求该对象属于特定类呢? 问题答案: 您可以将其定义为通用函数,并使用类型约束来同时要求类和协议。 斯威夫特4 Swift 3 (也适用于Swift 4) 迅捷2
问题内容: 在Java中,如何将一个函数作为另一个函数的参数传递? 问题答案: Java 8及以上 如果你的类或接口只有一个抽象方法(有时称为SAM type),则使用Java 8+ lambda表达式,例如: 然后可以在使用MyInterface的任何地方替换lambda表达式: 例如,你可以非常快速地创建一个新线程: 并使用方法引用语法使其更加清晰: 如果没有 lambda表达式,则最后两个示
问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi