Swift中的Currying初始化器
成为咖喱厨师IRL
这是我在Kayako上构建应用程序时经常遇到的一种情况-我必须初始化一个对象(或对象数组),并且涉及并行(或根据情况而定)运行的多个API调用。
现在,这似乎很简单。 等待直到所有数据准备就绪(存储在全局变量或其他变量中),然后初始化对象。 对?
是的, 是的。 但是如果我不想写怎么办
令x = Obj(a:1,b:2,c:3,依此类推.....)
而不是创建全局变量。 如果..我想要更快的解决方案?
好吧,这是一个解决方案
通过使用currying部分地初始化对象,并在获得更多信息后进行完全初始化,它可以帮助您(很棒的Swift🔶Developer),编写清晰简洁的代码并从长远来看节省时间。
代码
因此,假设您有一个Car Object。 我们将使用一个结构,因为“ Viva la值类型!”且不变性=❤
摩托车(或自行车)可被视为发动机+轮胎
//:为简便起见。 另外,命名元组是🔥🔥🔥
typealias TirePair =(前:轮胎,后:轮胎)
//:愚蠢的媒介不会让我正确缩进我的代码😡
结构引擎{
let horsePower:整数
让做:字符串
}
struct Tire {
允许直径:浮动
}
还有我们的自行车课
struct Bike {
let engine:引擎
让轮胎:TirePair
//:这是唯一需要的功能
静态函数generateBike(引擎:引擎,轮胎:TirePair)->自行车{
返回自行车(发动机:发动机,轮胎:轮胎)
}
}
如果您使用thoughtbot的很棒的库Curry之类的东西来咖喱
让curriedInit = curry(Bike.generateBike)
我们可以像这样部分初始化它
//:也可以在API的回调函数中
let engine = Engine(horsePower:12,make:“ asdfkjnadsf”)
让partialBike = curriedInit(引擎)
然后只需传递TyrePair和瞧! 我们有完整的自行车准备出发
//:第二个API调用
let tirePair =(前:轮胎(直径:12),后:轮胎(直径:14))
让fullBike = partialBike(轮胎配对)
//: 好极了!
它非常优雅,可以在缩短代码的同时仍保持类型安全性,而这正是我们所熟知和喜爱的(咖喱是一个文件框架,因此文件大小不是问题)。
如果我错过了任何优势,或者如果某人在生产中实现了类似的功能,我很乐意在下面的回复中听到您的声音。
哦,推荐也不错👇