Tag: 仿制药

Swift中的genericstypes

在haskell中,你可以这样做: type Parser a = String -> [(a, String)] 我试图在Swift中做类似的东西。 到目前为止,我没有运气写这些代码。 typealias Parser<A> = String -> [(A, String)] typealias Parser a = String -> [(a, String)] typealias Parser = String -> [(A, String)] 那么,这是不是迅速? 如果是,还有其他的方法来实现这种行为? 更新:似乎genericstypes现在支持在swift 3 https://github.com/apple/swift/blob/master/CHANGELOG.md

如何在Swift中的types为的Dictionary中存储Class <ClassImplementingProtocol>types的值?

我想在一个types为[String:SomeClass]的字典中存储一个更专门化的types。 下面是一些示例代码,说明我的问题(也可以在https://swiftlang.ng.bluemix.net/#/repl/579756cf9966ba6275fc794a上玩): class Thing<T> {} protocol Flavor {} class Vanilla: Flavor {} var dict = [String:Thing<Flavor>]() dict["foo"] = Thing<Vanilla>() 它会ERROR at line 9, col 28: cannot assign value of type 'Thing<Vanilla>' to type 'Thing<Any>?'产生错误ERROR at line 9, col 28: cannot assign value of type 'Thing<Vanilla>' to type 'Thing<Any>?' 。 我尝试过将Thing<Vanilla>() as Thing<Flavor>但是产生这个错误cannot convert value of […]

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层次结构一样提供结构?