Swift 使nil符合自定义协议
为了练习Swift,我一直在开发SQLite包装器。现在是时候添加对Swift 使nil符合自定义协议,swift,Swift,为了练习Swift,我一直在开发SQLite包装器。现在是时候添加对NULL的支持了。我的包装器的当前体系结构如下所示: public protocol Bindable { func bindTo(statement:Statement, atIndex:Int32) -> Bool } let arguments:[Bindable] = ["Chris", nil] 我有一个func,它接受一个查询和一个参数数组。数组中的参数必须确认名为Bindable的协议。采用此协议的每
NULL
的支持了。我的包装器的当前体系结构如下所示:
public protocol Bindable {
func bindTo(statement:Statement, atIndex:Int32) -> Bool
}
let arguments:[Bindable] = ["Chris", nil]
我有一个func
,它接受一个查询和一个参数数组。数组中的参数必须确认名为Bindable
的协议。采用此协议的每个类型都知道如何将其实例绑定到SQL语句。因此,它看起来是这样的:
public protocol Bindable {
func bindTo(statement:Statement, atIndex:Int32) -> Bool
}
let arguments:[Bindable] = ["Chris", nil]
我制作了几种类型(String
,Int
)以符合此协议。为了支持NULL
,我想允许参数数组包含nil
-如下值:
public protocol Bindable {
func bindTo(statement:Statement, atIndex:Int32) -> Bool
}
let arguments:[Bindable] = ["Chris", nil]
这是行不通的
在Objective-C中,我只需使用一个类别将-bindToStatement:atIndex:
添加到NSNull
。由于nil
不是Swift中的类型,我无法扩展nil
,因此我无法实现Bindable
我可以使用NSNull
,但我想避免这样做,因为我只想使用Swift。我还可以创建一个名为SQLNullValue
的常量,它是确认为Bindable
的类型的实例。但我也希望避免这种情况,因为我不想发明新的东西来表示NULL
/没有值
那么在Swift中我该怎么做呢?让参数:[Bindable?]=[“Chris”,nil]?@ToddAgulnick在某种意义上肯定是正确的。如果你不接受
nil
在Swift中不仅不是一个类型,甚至不是一个值,那么你(OP)对你所做的一切都不会满意。这甚至不是一件事。它只是一个文字符号,Optional的缩写。None
-除非图片中有可选项,否则不能使用它。这是可行的,但在我的实现中有很多特殊情况,我必须检查nil并做一些特殊的事情,而不是像使用NSNull那样在nil上调用方法……我以前说过:它有效,而且比一个自定义的空值常量,但不是完美的IMHO…@matt Yep,这是我的建议——你应该接受optionals机制,而不是试图绕过它。