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(轮胎配对) 
//: 好极了!

它非常优雅,可以在缩短代码的同时仍保持类型安全性,而这正是我们所熟知和喜爱的(咖喱是一个文件框架,因此文件大小不是问题)。

如果我错过了任何优势,或者如果某人在生产中实现了类似的功能,我很乐意在下面的回复中听到您的声音。

哦,推荐也不错👇