什么是Swift中的Optional <t>和可选类型之间的区别?扩展可选以携带错误信息?</t>

时间:2014-06-12 13:22:38

标签: cocoa error-handling programming-languages swift optional

  

更新 - 可选类型和可选类型之间没有区别   在斯威夫特 - 他们是一回事。

所以在Swift中,他们引入了Type?构造,它创建了一个可选类型,强制&#34;强迫&#34;程序员检查值是否确实存在。

此外,在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

那么为什么他们没有为所有可选类型添加属性来携带错误信息呢?它不会有用吗?我的意思是,如果你想要多种返回类型,你可以返回一个元组...

5 个答案:

答案 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.
}

apple docs说:

  

Swift中的可选链接类似于Objective-C中的消息传递nil,但其方式适用于任何类型,并且可以检查其成功与否。

答案 2 :(得分:0)

swift中的

Option与Scala中的Option(Haskell中的Maybe)相似:它表示可能不存在的值。

您正在寻找的内容类似于来自Scala的TryEither 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>