Questions tagged «swift-protocols»

特定于Swift语言的协议

6
如何在“纯” Swift中创建弱协议引用(不带@objc)
weak除非a protocol声明为@objc,否则引用似乎在Swift中不起作用,我不希望在纯Swift应用程序中使用它。 这段代码给出了一个编译错误(weak不能应用于非类类型MyClassDelegate): class MyClass { weak var delegate: MyClassDelegate? } protocol MyClassDelegate { } 我需要给协议加上前缀@objc,然后它才能工作。 问题:什么是完成Swift的“纯” Swift方法weak delegate?


7
快速将协议用作数组类型和函数参数
我想创建一个类,可以存储符合特定协议的对象。对象应存储在类型数组中。根据Swift文档协议可以用作类型: 由于它是一种类型,因此可以在允许使用其他类型的许多地方使用协议,包括: 作为函数,方法或初始化程序中的参数类型或返回类型 作为常量,变量或属性的类型 作为数组,字典或其他容器中项目的类型 但是,以下内容会生成编译器错误: 协议“ SomeProtocol”只能用作通用约束,因为它具有“自我”或相关类型要求 您应该如何解决这个问题: protocol SomeProtocol: Equatable { func bla() } class SomeClass { var protocols = [SomeProtocol]() func addElement(element: SomeProtocol) { self.protocols.append(element) } func removeElement(element: SomeProtocol) { if let index = find(self.protocols, element) { self.protocols.removeAtIndex(index) } } }

3
协议不符合自身?
为什么此Swift代码无法编译? protocol P { } struct S: P { } let arr:[P] = [ S() ] extension Array where Element : P { func test<T>() -> [T] { return [] } } let result : [S] = arr.test() 编译器说:“类型P不符合协议P”(或在Swift的更高版本中,“不支持将'P'用作符合协议'P'的具体类型”。) 为什么不?某种程度上,这感觉就像是语言上的一个漏洞。我意识到问题源于将数组声明arr为协议类型的数组,但这是不合理的事情吗?我认为协议确实可以帮助提供类型分层结构之类的结构吗?

2
“ Protocol…只能用作通用约束,因为它具有Self或关联的类型要求”是什么意思?
我正在尝试创建一个字典(实际上是HashSet),该字典以Swift中的自定义协议为键,但这给了我标题错误: 协议“ myProtocol”只能用作通用约束,因为它具有“自我”或相关类型要求 而且我不能做它的正面或反面。 protocol Observing: Hashable { } var observers = HashSet<Observing>()

3
非“ @objc”方法不满足“ @objc”协议的可选要求
概述: 我有一个协议P1,它提供了Objective-C可选功能之一的默认实现。 当我提供可选功能的默认实现时,会出现警告 编译器警告: Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate' 版: 斯威夫特:3 Xcode:8(公开发行) 尝试: 尝试添加@objc但无济于事 题: 我该如何解决? 有没有解决的办法? 码: @objc protocol P1 : UIAdaptivePresentationControllerDelegate { } extension P1 where Self : UIViewController { func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { return …

5
协议只能用作一般约束,因为它具有Self或relatedType要求
我有一个协议RequestType,它具有如下的relatedType模型。 public protocol RequestType: class { associatedtype Model var path: String { get set } } public extension RequestType { public func executeRequest(completionHandler: Result<Model, NSError> -> Void) { request.response(rootKeyPath: rootKeyPath) { [weak self] (response: Response<Model, NSError>) -> Void in completionHandler(response.result) guard let weakSelf = self else { return } if …

5
在Swift中,如何声明符合一个或多个协议的特定类型的变量?
在Swift中,我可以通过声明如下来显式设置变量的类型: var object: TYPE_NAME 如果我们想更进一步,并声明一个符合多种协议的变量,可以使用protocol声明式: var object: protocol<ProtocolOne,ProtocolTwo>//etc 如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?相当于Objective-C的样子如下: NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...; 在Swift中,我希望它看起来像这样: var object: TYPE_NAME,ProtocolOne//etc 这使我们能够灵活处理基本类型的实现以及协议中定义的添加接口。 还有其他更明显的方式可能会让我丢失吗? 例 例如,假设我有一家UITableViewCell工厂负责返回符合协议的单元。我们可以轻松地设置一个泛型函数来返回符合协议的单元格: class CellFactory { class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T { //etc } } 稍后我想在利用类型和协议的同时使这些单元出队 var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell 这会返回错误,因为表视图单元格不符合协议... 我想能够指定单元格是a …

15
如何使枚举符合Swift中的协议?
Swift文档说,类,结构和枚举都可以符合协议,我可以说它们都符合。但是我无法让枚举的行为完全类似于类和结构示例: protocol ExampleProtocol { var simpleDescription: String { get set } mutating func adjust() } class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." } } var a = SimpleClass() a.adjust() let aDescription …

4
“严重错误:数组无法从Objective-C桥接” —为什么还要尝试Swift,Swift?
我已经声明了Swift协议: protocol Option { var name: String { get } } 我声明了该协议的多种实现-一些类,一些枚举。 我有一个视图控制器,其属性声明为: var options: [Option] = [] 当我尝试将此属性设置为Option在另一个VC 中实现协议的对象数组prepareForSegue时,出现运行时错误: fatal error: array cannot be bridged from Objective-C 为什么不起作用?编译器具有所需的所有信息,而我根本不了解Objective-C与它有什么关系-我的项目仅包含Swift文件,并且这些数组不会进出任何框架方法,必须将它们桥接到NSArray。


9
协议功能返回自我
我有一个协议P,它返回对象的副本: protocol P { func copy() -> Self } 和一个实现P的类C: class C : P { func copy() -> Self { return C() } } 但是,是否Self在出现以下错误时放入返回值: 无法将类型“ C”的返回表达式转换为类型“ Self” 我也试着回来C。 class C : P { func copy() -> C { return C() } } 这导致以下错误: 非最终类“ C”中的方法“ copy()”必须返回Self以符合协议“ P” 除了我class C以finalie做前缀的情况外,没有任何作用: …

3
为什么我不能在Swift中使用let in协议?
我对Swift中使用var和关键字{get set}的协议有疑问。 从Apple文档: 如果协议要求某个属性是可获取和可设置的,则该常量要求不能通过常量存储属性或只读计算属性来满足。如果协议仅要求一个属性是可获取的,则该要求可以由任何种类的属性来满足,并且如果该属性对您自己的代码有用,那么也可以对该属性进行设置是有效的。 属性要求始终声明为变量属性,并以var关键字为前缀。通过在类型声明后写{get set}来表示可获取和可设置的属性,通过写{get}来表示可获取的属性。 我不明白为什么我不能使用let。一个变种中,只有一个协议获取不只是让? 像这样: protocol someProtocol { var someProperty: String { get } } 这不只是: protocol someProtocol { let someProperty: String } 我想念什么吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.