Tag: 迅捷的

Swift通用强制误解

我正在使用信号库。 假设我定义了符合BaseProtocol BaseProtocol协议和ChildClass 。 protocol BaseProtocol {} class ChildClass: BaseProtocol {} 现在我想存储像这样的信号: var signals: Array<Signal<BaseProtocol>> = [] let signalOfChild = Signal<ChildClass>() signals.append(signalOfChild) 我收到错误: 但是,我可以写下一行没有任何编译器错误 var arrays = Array<Array<BaseProtocol>>() let arrayOfChild = Array<ChildClass>() arrays.append(arrayOfChild) 那么,通用Swift数组和genericsSignal有什么区别呢?

是否可以将types约束添加到Swift协议一致性扩展?

我想扩展Array添加符合一个新的协议 – 但只适用于其元素本身符合特定协议的数组。 更一般地说,我希望只有当types参数符合一定的约束条件时,带有types参数的types(不pipe是协议还是具体types)才能实现协议。 从Swift 2.0开始,这似乎是不可能的。 有没有我失踪的方法? 例 假设我们有Friendly协议: protocol Friendly { func sayHi() } 我们可以扩展现有的types来实现它: extension String: Friendly { func sayHi() { print("Greetings from \(self)!") } } "Sally".sayHi() 当元素全部Friendly时,我们也可以扩展Array来实现sayHi() extension Array where Element: Friendly { func sayHi() { for elem in self { elem.sayHi() } } } ["Sally", "Fred"].sayHi() 此时, [Friendly]types应该自己实现Friendly ,因为它符合协议的要求。 但是,这段代码不能编译: extension […]

协议不符合自己?

为什么这个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() 编译器说:“typesP不符合协议P ”(或在更高版本的Swift中,“使用'P'作为符合协议'P'的具体types不被支持”)。 为什么不? 不知怎的,这感觉就像是一个语言漏洞。 我意识到这个问题源于将数组arr声明为一个协议types的数组,但这是不合理的事情吗? 我认为协议在那里确实有助于像types层次结构一样提供结构?