问题标签 [swift-protocols]
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.
ios - 使 swift 类符合协议 - 在静态/类级别
我正在尝试在 Swift 中构建一个通用的 UITableViewController 子类,它可以容纳任意数量的不同类型的表格视图单元格,而无需了解它们中的任何一个。
为此,我尝试为我的模型和表格视图单元格使用协议。模型的协议将返回我应该去哪个单元格类别,而单元格的协议将返回对给定模型的单元格高度应该是多少等问题的答案。
但是我在使协议工作时遇到问题,因为使用第二个协议我想进入单元的类而不是它的实例。
模型的协议如下:
细胞的协议如下:
注意关键字“static”的使用。这些方法是 UITableViewCell 子类中的类方法,添加静态似乎是我需要做的来验证这些类是否符合,或者我理解。
当我使用第一个协议时,代码看起来像这样,它编译:
它正在调用此方法(作为一个示例):
这将返回单元格的类,例如“JBSLiteratureTableViewCell.self”
当我使用第二个协议时,代码看起来像这样,并且无法编译:
由于之前的 static 关键字,它无法编译,我得到的编译器错误是:
“JBSTableViewCellInterface”没有名为“tableView”的成员
如果我从协议函数中取出静态关键字,它会编译,但是 UITableViewCell 子类抱怨说:
“JBSLiteratureTableViewCell”不符合协议“JBSTableViewCellInterface”
这是因为他们现在正试图确保实例方法存在,而这些方法并不存在。
如何使 swift 类符合类级别的协议,所以它可以是我的委托而不是类的某个实例?我确信我可以通过创建作为单例的协议 JBSTableViewCellInterface 的帮助程序类并让它们完成工作来解决这个问题,但我宁愿将它直接构建到其类方法中的 UITableViewCell 子类中。
ios - 传递一个 Swift 类作为参数,然后从中调用一个类方法
我希望能够将一个类存储为一个变量,所以我可以稍后从中调用类方法,如下所示:
我希望能够这样说:
我想弄清楚的是:
1) 如何定义协议以便我可以调用类 func doSomething?
2) cellClass 的声明需要是什么?
3)电话会是什么样子?
ios - Swift:无法为协议的属性赋值?
A 类提供一个字符串值。B 类内部有两个 A 类型的成员,并提供一个计算属性“v”来选择其中一个。
这段代码很简单,而且很有效。由于 A 和 B 都有一个成员“值”,因此我将其设为这样的协议:
如果我更改以下代码
至
它再次起作用!
这是 Swift 的错误,还是协议属性的特殊情况?
arrays - Swift 中的泛型数组
我一直在玩不同类型的泛型类数组。用一些示例代码最容易解释我的问题:
现在,如果我尝试像这样创建一个容器数组:
我得到错误:
协议“MyProtocol”只能用作通用约束,因为它具有 Self 或关联的类型要求。
要解决这个问题,我可以使用[AnyObject]
:
但是现在在枚举时出现了另一个“问题” containers
:
正如您在上面的代码中所看到的,在确定了container
相同方法的类型之后,两种情况都会被调用。我的问题是:
有没有比转换为每种可能的类型更好的方法来获得Container
正确的类型Container
?或者还有什么我忽略的?
ios - 使用协议实现多个 API 调用(服务器请求)
我正在用 Swift 为 iOS 制作一个应用程序,并且我试图将我的 API 调用逻辑保留在我的 ViewControllers 之外。我按照本教程进行了 1 个 API 调用,我将在下面进行描述。
我正在创建 ViewController 将实现的协议“APIControllerProtocol”,然后我正在创建一个 APIController 类,该类将包含一个名为“delegate”的属性来保存 APIControllerProtocol 类型的实例。该协议被简单地定义为
并且 ViewController 会实现在 API 调用返回 JSON 数据后调用的 didReceiveAPIResults 函数。ViewController 将包含 APIController 的一个实例,以调用一个调用 API 的函数。
此时我想让更多的 ViewController 执行 API 调用,如果我只需要对每个 ViewController 进行 1 个 API 调用,我可以在 APIController 中添加另一个函数,我可以让新的 ViewController 使用相同的协议。但是,如果存在需要进行 2 次或更多 API 调用的 ViewController,则此逻辑是有缺陷的,因为
- 我不能以两种不同的方式在 ViewController 中调用 didReceiveAPIResults,
我不认为向 APIController 类添加多个“委托”属性来保存不同类型的协议是要走的路。
在一个协议中定义多个函数意味着我必须在 ViewControllers 中实现所有这些函数,而这些函数只需要进行 1 个 API 调用。
我解决这个问题的想法是
为每个 ViewController 创建一个 APIController 类和 APIControllerProtocol
在 APIControllerProtocol 中使用可选函数,因此并非每个 ViewController 都必须实现所有函数(我不知道这将如何真正起作用)
任何其他见解将不胜感激。
swift - Swift 协议强制 Equatable 协议
我已经定义了 2 个协议。我需要第一个(NameProtocol)来执行 Equatable 协议。而另一个类(BuilderProtocol)有一个返回第一个类(NameProtocol)的方法。
编译器错误:“Protocol 'NameProtocol' 只能用作通用约束,因为它具有 Self 或关联的类型要求”
我需要 build() 返回的对象来返回一个符合 NameProtocol 并且我可以在其上定义 == 的对象
有没有办法让这个工作?
谢谢
如果在 BuilderProtocol 中使用 typealias 我怎样才能使数组声明工作?
结论
我将删除 Equatable 并实现 isEqual 方法。
swift - 在 Swift 中创建类型属性并符合协议
我想创建一个具有某种类型并且符合协议的属性,我会在 Objective-C 中这样做:
我正在寻找的是指定属性可以使用 UIViewController 类型的对象设置,该对象也符合 CustomProtocol,以便清楚基类是什么。我知道我可能只使用一个短类存根来获得相同的结果,即
但这似乎不是最干净的方法。
cocoa - 类似于 Equatable 的 Swift 协议
我正在尝试为 Lerp-able (linear-interpolatable) 的类型创建一个协议。我声明它的方式与Equatable
定义方式类似:
不幸的是,当我尝试实现Lerpable
for时Double
:
我收到一个错误:Type 'Double' does not conform to protocol 'Lerpable'
。
我认为这很简单,但也许我只是不明白 Equatable 是如何工作的。或者它是 Swift 中的一个特例?有什么想法吗?
更新:正确答案如下,这是代码的最终版本,供其他人参考:
我添加了全局lerp
函数,所以我仍然可以将其称为
lerp(foo, bar, alpha: 0.5)
而不是
foo.lerp(bar, alpha: 0.5)
swift - 测试协议与关联类型的一致性
我有一个使用关联类型的协议,例如:
和实现协议的类:
但是当我尝试强制转换或测试一致性时,如下所示:
我得到错误:
Protocol 'Populatable' 只能用作通用约束,因为它具有 Self 或关联的类型要求
测试对象是否符合可填充协议的正确方法是什么?
注意:尝试此操作所需的所有代码都包含在问题中,只需将代码块复制到操场上即可。
ios - “致命错误:数组无法从 Objective-C 桥接”——你为什么还要尝试,Swift?
我已经声明了一个 Swift 协议:
我声明了这个协议的多个实现——一些类,一些枚举。
我有一个视图控制器,其属性声明如下:
Option
当我尝试将此属性设置为在另一个 VC中实现协议的对象数组prepareForSegue
时,出现运行时错误:
为什么这不起作用?编译器拥有它需要的所有信息,我根本不明白 Objective-C 与它有什么关系——我的项目只包含 Swift 文件,而且这些数组不会进出任何框架方法必须将它们桥接到NSArray
.