我有一系列协议.现在我想通过查找数组的协议索引从数组中删除一个项目.但是,在将协议对象与数组中的项进行比较时,编译器会发出警告:
"协议"不符合AnyObject
protocol SomeProtocol {}
var list:[SomeProtocol] = []
func add(some:SomeProtocol) { list+=some }
func remove(some:SomeProtocol) {
var index = -1
for i in 0...list.count-1 { if [i] === some { index = i } }
if index >= 0 { list.removeAtIndex(index) }
}
Run Code Online (Sandbox Code Playgroud) 我有一个名为Field的自定义对象.我基本上用它来定义表单中的单个字段.
class Field {
var name: String
var value: Any?
// initializers here...
}
Run Code Online (Sandbox Code Playgroud)
当用户提交表单时,我验证每个Field对象以确保它们包含有效值.有些字段不是必需的,所以我有时会故意设置nil为这样的value属性:
field.value = nil
Run Code Online (Sandbox Code Playgroud)
当我使用if-let来确定字段是否为零时,这似乎会造成问题.
if let value = field.value {
// The field has a value, ignore it...
} else {
// Add field.name to the missing fields array. Later, show the
// missing fields in a dialog.
}
Run Code Online (Sandbox Code Playgroud)
我在上面的if-else中设置了断点,当field.value故意设置为nil时,它会通过if-let块,而不是else.但是,对于field.value我未初始化和未分配的字段,程序将转到else块.
我想打印出来field.value,并value在IF-让块内:
if let value = field.value {
NSLog("field.value: …Run Code Online (Sandbox Code Playgroud) 我想在Swift中表示一个通用的JSON对象:
let foo: [String: Any] = [
"foo": 1,
"bar": "baz",
]
Run Code Online (Sandbox Code Playgroud)
但[String: Any]编译器建议的类型并不能很好地工作.我无法检查该类型的两个实例是否相等,例如,虽然这应该可以使用两个JSON树.
什么也行不通的是使用Codable机器将该值编码为JSON字符串:
let encoded = try JSONEncoder().encode(foo)
Run Code Online (Sandbox Code Playgroud)
哪个因错误而爆炸:
fatal error: Dictionary<String, Any> does not conform to Encodable because Any does not conform to Encodable.
Run Code Online (Sandbox Code Playgroud)
我知道我可以引入一个精确的类型,但我遵循通用的JSON结构.我甚至尝试为泛型JSON引入一种特定类型:
enum JSON {
case string(String)
case number(Float)
case object([String:JSON])
case array([JSON])
case bool(Bool)
case null
}
Run Code Online (Sandbox Code Playgroud)
但是当实现Codable这个枚举时我不知道如何实现encode(to:),因为一个键控容器(用于编码对象)需要一个特定的CodingKey参数,我不知道如何得到它.
是否真的不可能创建一个Equatable通用的JSON树并使用它编码Codable?
您可以在下面的图像中看到我正在尝试扩展Collection协议以包含一个被调用的方法removingDuplicates,该方法应该完全按照它所说的去做.编译器显示的错误似乎与Equatable协议的定义直接相矛盾.这是一个错误还是我误解了什么?