Cocoa 什么';这是可选的<;T>;和Swift中的可选类型?扩展可选项以携带错误信息?
更新-可选类型和可选类型之间没有区别 在Swift中,它们是相同的东西 因此,在Swift中,他们引入了Cocoa 什么';这是可选的<;T>;和Swift中的可选类型?扩展可选项以携带错误信息?,cocoa,error-handling,programming-languages,swift,optional,Cocoa,Error Handling,Programming Languages,Swift,Optional,更新-可选类型和可选类型之间没有区别 在Swift中,它们是相同的东西 因此,在Swift中,他们引入了Type?构造,该构造创建了一个可选类型,“强制”程序员检查该值是否确实存在 此外,在Swift中没有异常处理。 但有这种内在的选择机制 此可选功能?只是一个可选的枚举,其幕后灵感来自Haskell的Maybe 我想知道是否有任何方法可以通过可选类型传递错误信息。 能否通过可选类型Int?返回错误信息?这能代替异常或N错误吗?当然,Cocoa仍然使用(并且将使用?)NSError模式 在操场上
Type?
构造,该构造创建了一个可选类型,“强制”程序员检查该值是否确实存在
此外,在Swift中没有异常处理。
但有这种内在的选择机制
此可选功能?
只是一个可选的枚举,其幕后灵感来自Haskell的Maybe
我想知道是否有任何方法可以通过可选类型传递错误信息。
能否通过可选类型Int?
返回错误信息?这能代替异常或N错误吗?当然,Cocoa仍然使用(并且将使用?)NSError模式
在操场上玩耍时,我在Swift的“标题”中发现了这段代码:
基本上,这会向任何可选类型添加只读属性description
。这将是非常强大的(我想可能会导致很多问题)
但是在尝试扩展T?
之后,我得到了一个错误:
Non-nominal type 'T?' cannot be extended
那么为什么他们不在所有可选类型中添加一个属性来携带错误信息呢?这不是很有用吗?我的意思是,如果需要多个返回类型,可以返回一个元组…选项基本上允许您检查变量是否为零。它并不意味着有错误消息。例如,以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,但其方式适用于任何类型,并且可以检查成功或失败
swift中的Option
类似于Scala中的Option
(Maybe
在Haskell中):它表示一个可能不存在的值
您要查找的是类似于Scala中的Try
或单子,它们表示计算的两种可能状态,通常是成功
或失败
这将是一种不同的代数数据类型,超出了可选值的用途
最终,由于swift在标准库中没有完整的monad,我认为默认的错误处理模式将保持经典的CocoaNSError
one。根据,正确的语法是:
extension Optional : Printable {
//...
}
Optional
是Optionals的定义(见下文)<代码>类型?
只是创建类型的语法糖
enum Optional<T> {
case None
case Some(T)
}
enum可选{
无案例
案例(T)
}
在Swift编程语言iBook中,下面的两个声明是等效的
var optionalInteger: Int?
var opTionalInteger: Optional<Int>
var optionInteger:Int?
var OptionInteger:可选
这已经是该语言的一部分
extension Optional : DebugPrintable {
/// A textual representation of `self`, suitable for debugging.
var debugDescription: String { get }
}
extension Optional : DebugPrintable {
/// A textual representation of `self`, suitable for debugging.
var debugDescription: String { get }
}