Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使nil符合自定义协议_Swift - Fatal编程技术网

Swift 使nil符合自定义协议

Swift 使nil符合自定义协议,swift,Swift,为了练习Swift,我一直在开发SQLite包装器。现在是时候添加对NULL的支持了。我的包装器的当前体系结构如下所示: public protocol Bindable { func bindTo(statement:Statement, atIndex:Int32) -> Bool } let arguments:[Bindable] = ["Chris", nil] 我有一个func,它接受一个查询和一个参数数组。数组中的参数必须确认名为Bindable的协议。采用此协议的每

为了练习Swift,我一直在开发SQLite包装器。现在是时候添加对
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机制,而不是试图绕过它。