更新 - 可选类型和可选类型之间没有区别 在斯威夫特 - 他们是一回事。
所以在Swift中,他们引入了Type?
构造,它创建了一个可选类型,强制"强迫"程序员检查值是否确实存在。
此外,在Swift中没有异常处理。 但是有这种内置的可选性机制。
这个可选功能?
只是在Haskell Optional<T>
启发的幕后的Maybe
枚举。
我想知道是否有任何方法可以通过可选类型传递错误信息。
"abc123".toInt()
可以通过可选类型Int?
返回错误信息吗?这可以取代Exceptions或NSError吗?当然Cocoa仍然使用(并将使用?)NSError模式。
在操场上玩,我在Swift&#34;标题中找到了这段代码&#34;:
protocol Printable {
var description: String { get }
}
extension T? : Printable {
var description: String { get }
}
基本上,这会向任何可选类型添加只读属性description
。这将是超级强大的(并且可能导致许多问题,我猜)。
但是在试图扩展自己T?
之后我得到了一个错误:
Non-nominal type 'T?' cannot be extended
那么为什么他们没有为所有可选类型添加属性来携带错误信息呢?它不会有用吗?我的意思是,如果你想要多种返回类型,你可以返回一个元组...
答案 0 :(得分:1)
这已经是语言的一部分
extension Optional : DebugPrintable {
/// A textual representation of `self`, suitable for debugging.
var debugDescription: String { get }
}
答案 1 :(得分:0)
Optionals基本上允许您检查变量是否为零。它并不意味着有错误信息。例如,请使用此Objective-C片段:
if(self.someProperty == nil){
self.someProperty = [[PropertyClass alloc] init]
}else{
//property is not nil.
}
在swift中你会做这样的事情:
var someProperty : PropertyClass?
if(someProperty){
//property is not nil
}else{
//property is nil.
}
Swift中的可选链接类似于Objective-C中的消息传递nil,但其方式适用于任何类型,并且可以检查其成功与否。
答案 2 :(得分:0)
Option
与Scala中的Option
(Haskell中的Maybe
)相似:它表示可能不存在的值。
您正在寻找的内容类似于来自Scala的Try
或Either
monad,它们代表计算的两种可能状态,通常为Success
或{{1 }}
这将是一种不同的代数数据类型,超出了可选值的目的。
最终,由于swift在标准库中没有完整的monad,我认为默认的错误处理模式将保留经典的Cocoa Failure
。
答案 3 :(得分:0)
每this answer,正确的语法是:
extension Optional : Printable {
//...
}
答案 4 :(得分:0)
Optional<T>
是Optionals的定义(见下文)。 Type?
只是创建类型的语法糖。
enum Optional<T> {
case None
case Some(T)
}
从 Swift编程语言 iBook,下面的两个声明是等效的
var optionalInteger: Int?
var opTionalInteger: Optional<Int>