Junkor

类型包装(Wrapper Types)

文章翻译自objc,原文连接:『Map for Optionals

有时我们需要两种类型可以相互区分。例如,你有一个包含积分的用户账户系统,你有一个函数可以从服务端获取相应用户的积分:

func credits(account: Account) -> Int

尽管如此,有些时候,在你的代码深处,你或许会看到这个Int数值,却不知道它代表的是用户的积分。此时,增加一个typealias是很有帮助的,这样你就可以让函数返回一个积分类型的返回值:

typealias Credits = Int

func credits(account: Account) -> Credits

这样处理以后,你就可以随意使用Credits类型了。这样对代码的易读性是很有帮助的:一看便知Credits是干嘛使的。我们还可以更进一步:假设Credits是来自后端的,且前段是不可修改的。为了避免我们把Credits当成Int处理,我们可以把它包装成struct:

struct Credits { let amount: Int }

这样做的好处是:当你想做类似这样的操作Credits(amount: 0) + 1 或者对两个Credits类型数据相加,你都会收到编译器的警报。将简单的integer做类型包装可以避免很多不必要的麻烦。比如你在处理货币转换、单位换算等场景时都是很有用的。你还可以包装其他类型:在一些场景下,你可以包装一个string数据然后就可以方便的应用在不同的地方。