我尝试了解swift 2中的新错误处理事情.这是我做的:我首先声明了一个错误枚举:
enum SandwichError: ErrorType {
case NotMe
case DoItYourself
}
Run Code Online (Sandbox Code Playgroud)
然后我宣布了一个抛出错误的方法(不是一个例外的人.这是一个错误.).这是方法:
func makeMeSandwich(names: [String: String]) throws -> String {
guard let sandwich = names["sandwich"] else {
throw SandwichError.NotMe
}
return sandwich
}
Run Code Online (Sandbox Code Playgroud)
问题来自呼叫方.以下是调用此方法的代码:
let kitchen = ["sandwich": "ready", "breakfeast": "not ready"]
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
}
Run Code Online (Sandbox Code Playgroud)
do行编译器说完之后Errors thrown from here are not handled because the enclosing …
在Swift中,我历史上使用扩展来扩展封闭类型并提供方便的,无逻辑的功能,如动画,数学扩展等.但是,由于扩展是硬依赖性遍布整个代码库,我总是在实现之前三次思考某事作为延伸.
最近,我已经看到Apple建议在更大程度上使用扩展,例如将协议实现为单独的扩展.
也就是说,如果你有一个实现协议B的A类,你最终会得到这样的设计:
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
Run Code Online (Sandbox Code Playgroud)
当你进入那个兔子洞时,我开始看到更多基于扩展的代码,例如:
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
Run Code Online (Sandbox Code Playgroud)
我的一部分就像你在单独的扩展中实现协议时获得的构建块.它使得该类的独立部分非常独特.但是,只要继承此类,就必须更改此设计,因为无法覆盖扩展函数.
我认为第二种方法是......有趣.一旦它成功,那就是你不需要注释每个私有属性并将其作为私有属性,因为你可以为扩展指定.
但是,这种设计还会分割存储和非存储的属性,公共和私有函数,使类的"逻辑"更难遵循(我知道写较小的类).这与子类化问题一起使我在延伸仙境的门廊上停了下来.
很想听听Swift社区如何看待扩展.你怎么看?有一个银色的小礼物吗?
如果我有一个类Christmas和一个协议Merry,为了使Christmas符合Merry,许多人会这样做:
class Christmas {
...
}
extension Christmas: Merry {
...
}
Run Code Online (Sandbox Code Playgroud)
它也受到Apple的鼓励.
但是,在定义类时,让类符合协议是不是更方便?像这样:
class Christmas: Merry {
...
}
Run Code Online (Sandbox Code Playgroud)
两种方法有什么区别?