问题标签 [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.

0 投票
1 回答
3811 浏览

ios - 协议实现协议的默认实现

我正在尝试创建一个将由某些类实现的协议,它们都应该实现UIScrollViewDelegate. 我想到的是让我的新协议实现协议UIScrollViewDelegate

由于协议应该有它的默认实现,我还为此协议创建了一个扩展。

它编译,但不起作用。我做错了什么,创建扩展协议的默认实现的正确方法是什么?

0 投票
0 回答
84 浏览

swift - 在 Swift 公共类扩展中避免公共方法装饰器

假设我在 Swift 中定义了一个协议:

然后我在同一个源文件中定义一个类:

然后,我添加一个扩展名来MyClass指定MyProtocol同一个源文件中的一致性:

当我尝试在 Xcode 7.2 中编译上述代码时,我收到一个编译器错误,告诉我需要为每个扩展的方法添加一个公共装饰器:

有没有办法避免像上面那样用 注释类扩展中的每个方法public

注意:我知道删除publicfromMyClass会使上述编译错误消失,但我需要MyClass对使用它的 Objective-C 代码可见。

0 投票
2 回答
152 浏览

ios - 使用可选初始化器扩展 CollectionType

这在我想创建一个对象时有效

我正在尝试实现以下目标,但它在编译时给出错误。

以下代码给了我错误'nil 是初始化程序中唯一允许的返回值'。

================================== 答案:-

这将允许您使用以下代码进行初始化

0 投票
2 回答
2072 浏览

swift - Swift 中协议扩展的默认实现不起作用

NSManagedObject我正在尝试通过协议向 an 添加功能。我添加了一个可以正常工作的默认实现,但是一旦我尝试使用协议扩展我的子类,它就会告诉我它的某些部分没有实现,即使我添加了默认实现。

有人知道我做错了什么吗?

我得到的错误是Type Case doesn't conform to protocol ObjectByIdFetchable

非常感谢帮助。

0 投票
1 回答
1442 浏览

swift - 具有符合协议的属性的 Swift 协议扩展

我像这样声明了一个协议

在这里, JSONSerializable 不是一个实际的类型,它是我这样声明的另一个协议:

所以,事实上,这个 JSONConnection 协议需要一个名为 jsonRootObject 的变量,它只需要符合 JSONSerializable 协议即可。

美好的。


现在,对于实现。

我创建了一个名为 JSONStockDetailRootObject 的类,它符合 JSONSerializable 协议。

我想创建一个符合 JSONConnection 协议的 StockConnection 类。

我认为,如果我有一个符合 JSONSerializable 协议的类型的 jsonRootObject 变量,那么 StockConnection 类又将符合 JSONConnection 协议……但不是。

编译器声称:“协议需要属性 'jsonRootObject' 类型为 'JSONSerializable?'

我错过了什么?谢谢

0 投票
1 回答
559 浏览

swift - 从原始类中访问 swift 类扩展方法

以下代码无法为我编译:

错误发生在 myValue 被分配的行上,它显示:错误:'NSObject -> () ->MyClass 没有成员 anotherProtocolMethod 类型的值

有没有办法在不将 myValue 移动到类扩展中的情况下完成这项工作?

0 投票
1 回答
170 浏览

swift - 在 swift 中对 CollectionType 进行索引和迭代

我的代码基本上是这样的:

这很好用,但有时我想传入数组,有时我想传入 ArraySlice。我想我会改变它以使用泛型和CollectionType协议,转换如下:

但是,我收到以下编译器错误:

我可以切换到for i in data.indices进行编译的 for 循环,但是我不能再将它除以 2 来获得 midPoint,因为 data.indices 返回抽象CollectionType.Index而 / 2 是一个 Int。

可以在 Swift 中做这样的事情吗?我可以在抽象协议索引类型和一些我可以做数学运算的真实类型之间架起桥梁吗?

indicesPS:我已经看到并找到了其他使用and迭代整个集合的示例enumerate,但我明确地只想迭代一半以上的集合,这需要某种除以 2

谢谢

0 投票
1 回答
508 浏览

swift - 在 Swift 中创建类集群(使用工厂方法):“无法转换类型为“子类”的返回表达式?返回类型'Self?'”

我有一个类集群——当我Class从 JSON 创建一个实例时,我希望能够返回一个Class. 但是,我似乎无法使类型正常工作。

似乎 的实例Subclass应该可以转换为Class. 这里不是Class类型Self吗?

帮助。

0 投票
3 回答
6100 浏览

swift - 'X' 类型的值没有成员 'y' - 协议中的可选函数

我试图更好地理解 Swift 中的协议。特别是可选的协议方法。我认为这个问题可能与我在不同文件中定义/使用的协议有关,但如果你将以下内容放在操场上,你会遇到同样的问题:

这是错误消息:

出于某种原因,它不接受协议已在 NSObject 上定义。代码完成找到它,但编译器不让它通过。

我不确定我的?? true部分是否有效,但我希望这是一个默认值,以防方法未定义。

我怎样才能让它工作?

0 投票
3 回答
2918 浏览

swift - Swift 协议:隐藏一些属性

我想为和创建一个trimmedText属性。这是我所做的:UITextViewUITextField

我需要_text财产,因为text它被声明为String?inUITextFieldString!( UITextViewwhyyyy?! >_<)。现在我想隐藏这个属性以避免混乱 API。

这是我尝试过的:

1) 将其标记为private。编译器不允许这样做:'private' modifier cannot be used in protocols

2)将其分离为私有协议:

但是编译器再次抱怨: Property 'trimmedText' must be declared internal because it matches a requirement in internal protocol 'TrimmedTextSupporting'

我没主意了。