问题标签 [swift-structs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
302 浏览

swift - 带有结构/协议的 Swift 多态闭包调度

我有一个案例,我想向服务注册一个参数或不注册参数闭包。总是有一个可用的参数,但为简洁起见,我希望能够不注册任何 arg 闭包,然后在这种情况下只调度没有可用参数的闭包。来自强大的 OO 和动态类型背景,我们喜欢多态调度和类继承树并让类型自己弄清楚,我可以将以下内容放在一起:

所以我在我的控制台中42看到了。something happened伟大的。

但我想探索用structand/or来做这件事enum。价值语义风靡一时。我认为这种enum方法相对简单:

做一个struct方法,我的理解是我应该使用协议来捕获publish(value:T). 但这就是事情变得混乱的地方,因为协议显然不能与泛型混合?我试过了:

这只会在底部产生很多错误。我曾尝试将扩展作为泛型(例如extension NullaryAction<T>:Action),但它告诉我这T是未使用的,即使我已将typealias表达式放在扩展中。

是否可以使用结构/协议来做到这一点?我对枚举解决方案感到满意,但很失望我无法通过结构/协议方法实现它。

0 投票
2 回答
11453 浏览

swift - swift - 我可以从我的自定义初始化方法中调用结构默认成员初始化吗?

如果我创建一个没有 no 的 swift 结构init,那么我可以调用编译器生成的默认成员初始化器,如下所示:

我想做的是创建一个方便的init方法来从字典中反序列化,然后链接到默认的memberwise init。就像是

但是,当我尝试编写此代码时,编译器(Xcode 7.2)给了我错误“Extra argument 'qty' in call”,就好像它看不到默认成员并试图递归调用init(dictionary)

我可以编写自己的成员初始化,或者我可以直接从 my 分配属性init(dictionary),但如果我可以链接调用会很好。有没有办法快速做到这一点?

0 投票
2 回答
8156 浏览

swift - 从一个类访问结构到另一个类

是否可以从另一个类访问结构?

前任:

如何从 Class B() 中的 Class A() 访问结构?

有解决方法吗?

谢谢!

0 投票
4 回答
1842 浏览

swift - 有没有办法在Swift中为`struct`自动定义比较(`==`)函数?

假设我们struct在 Swift 中有一个相当大的:

..然后我们需要实现Equatable协议:

...而且我们需要编写很多行愚蠢的代码。有没有办法“要求”编译器为我们“做”它?

0 投票
5 回答
7311 浏览

swift - 为什么 didSet 不起作用?

didSet在我在 SO 上看到的许多示例中,此代码将返回0,但是,我无法让它返回原始值以外的任何内容。我究竟做错了什么?

迅速

输出

0 投票
2 回答
908 浏览

swift - 如何从镜像内省中改变孩子的价值

我在 iOS 中做了一堆 BLE,这意味着很多紧凑的 C 结构被编码/解码为字节数据包。以下操场片段说明了我一般尝试做的事情。

所以给定一系列不同大小的字段,我们没有得到“最紧密”的字节包装。相当知名和接受。鉴于我的简单结构,我希望能够在没有填充或对齐的情况下背靠背任意编码字段。实际上相对容易:

嘘!按预期工作。可能会在它周围添加一个类,或者可能是一个协议扩展并有一个很好的实用程序。我遇到的问题是相反的过程:

给定一个未填充的结构值,我可以适当地解码字节流,找出每个字段的新值。我不知道该怎么做是用新值实际更新目标结构。在上面的示例中,我展示了如何使用 C 来执行此操作,获取指向原始子项的指针,然后使用新值更新其值。我可以在 Python/Smalltalk/Ruby 中轻松完成。但我不知道如何在 Swift 中做到这一点。

更新

正如评论中所建议的,我可以执行以下操作:

基本上,我将各种流解码方法移动到字节流(即 Element == UInt8 的 GeneratorType),然后我只需要编写一个初始化程序,以相同的顺序将这些方法串起来,并将结构定义为类型。我想那部分,本质上是“复制”结构定义本身(因此容易出错),是我希望使用某种内省来处理的。镜子是我所知道的唯一真正的 Swift 内省,而且它似乎非常有限。

0 投票
2 回答
743 浏览

arrays - 为什么 [SomeStruct] 不能转换为 [Any]?

考虑以下:

我一直试图找到这背后的逻辑,但没有运气。值得一提的是,如果您将结构更改为类,它可以完美运行。

人们总是可以添加一种解决方法并映射 fooArray 的每个对象并将它们转换为 Any 类型,但这不是这里的问题。我正在寻找解释为什么会这样。

有人可以解释一下吗?

这个 SO question 导致我遇到了这个问题。

0 投票
0 回答
688 浏览

ios - Swift 2.2 MVVM 视图模型作为可变结构不在视图控制器中维护状态

我很清楚 Swift 中值类型和引用类型之间的区别,并且知道值类型被设计为不可变的用法。但结构尤其具有自我变异的能力,这是我关心的问题。如何有效地使用这些变异的结构值类型,以便它们保持它们的状态或变化。

我的问题是,在 iOS 应用程序的 MVVM 设计中,视图模型应该是类还是结构?由于视图模型包含模型/模型列表,并且这些模型实例会随着时间而变化(例如,视图模型从 Web 服务请求中获取更多模型实例并添加到它的模型数组中),视图控制器的视图模型如何更新这种变化。这是一个伪示例,但首先是一些注意事项和简要说明:

  • 我在这里没有使用任何绑定。(没有 RxSwift)。
  • 没有 KVO,我正在使用委托或完成处理程序设计。

例子:

  • 视图控制器具有视图模型的实例。当它出现时,它要求视图模型从 Web 服务中获取数据。
  • 查看模型触发服务,并在完成处理程序闭包中获得响应
  • 在这个闭包视图模型中,将一些模型实例添加到它的模型数组中。
  • 视图模型调用视图控制器的完成处理程序来通知服务请求的成功或错误。
  • 视图控制器对视图模型进行一些验证,然后相应地执行 UI 操作。

查看型号:

视图控制器:

在上面的代码中,当视图模型获得响应时,它会将数据添加到它的数组中,但是该更改永远不会传递给视图控制器,因为在闭包内部,更新的是视图模型的副本而不是视图控制器的模型。所以问题是这个变化是如何传递给视图控制器的?

我是否应该从闭包中返回更新的视图模型实例,并且在视图控制器的闭包中更新它是视图模型的实例。但这也不会像在视图控制器关闭中那样工作,我也会更新视图模型的副本??

我们应该如何处理?一种选择是让视图模型成为一个类,这样一切都是参考,我们在任何地方都更新同一个实例。但是由于视图模型和模型会发生同样的事情,模型也将是类。由于我们的应用程序的主要部分是视图控制器,因此我们创建的所有视图模型和模型都是类。所以我们真的没有在这里使用值类型的力量。

有什么建议么?

0 投票
3 回答
6107 浏览

ios - 闭包中的Swift可变结构和结构的行为不同

我有一个具有结构变量(S)的类(A)。在这个类的一个函数中,我在结构变量上调用了一个变异函数,这个函数需要一个闭包。这个闭包的主体检查结构变量的名称属性。

结构的变异函数依次调用某个类(B)的函数。此类的函数再次采用闭包。在这个闭包的主体中改变结构,即更改名称属性,并调用第一个类提供的闭包。

当我们在检查结构的 name 属性时调用第一个类 (A) 闭包时,它永远不会改变。

但是在第 2 步中,如果我使用结构 (C) 而不是 B 类,我会看到 A 类内部的闭包结构实际上发生了变化。下面是代码:

为什么会有这种不同的行为。我认为区分因素应该是我是使用视图模型的结构还是类。但这里取决于 Networking 是一个类还是一个结构,它独立于任何 ViewController 或 ViewModel。谁能帮我理解这一点?

0 投票
1 回答
69 浏览

swift - 搜索结构创建的对象

我想搜索结构创建的对象。

假设这些是我们由Candystruct 创建的对象。

我们如何在不创建两个数组并通过索引查找对象的情况下找到“棒棒糖”元素的类别?