相关疑难解决方法(0)

比较协议引用

我有一系列协议.现在我想通过查找数组的协议索引从数组中删除一个项目.但是,在将协议对象与数组中的项进行比较时,编译器会发出警告:

"协议"不符合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)

arrays compare protocols swift

7
推荐指数
2
解决办法
4116
查看次数

Swift如果让我们成功评估Optional(nil)

我有一个名为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)

cocoa cocoa-touch optional ios swift

5
推荐指数
1
解决办法
4170
查看次数

如何在Swift中表示通用的JSON结构?

我想在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

json types swift codable

5
推荐指数
1
解决办法
1607
查看次数

二元运算符'=='不能应用于两个'Equatable'操作数......什么?

您可以在下面的图像中看到我正在尝试扩展Collection协议以包含一个被调用的方法removingDuplicates,该方法应该完全按照它所说的去做.编译器显示的错误似乎与Equatable协议的定义直接相矛盾.这是一个错误还是我误解了什么?

在此输入图像描述

xcode protocols swift equatable

-2
推荐指数
1
解决办法
959
查看次数

标签 统计

swift ×4

protocols ×2

arrays ×1

cocoa ×1

cocoa-touch ×1

codable ×1

compare ×1

equatable ×1

ios ×1

json ×1

optional ×1

types ×1

xcode ×1