我正在处理Functional programming in Swift
中的一些代码,但是这本书没有使用Swift 2进行更新,我在以下代码中遇到错误:
func insert<T: Hashable>(key: [T], trie: Trie<T>) -> Trie<T> {
if let (head, tail) = key.decompose {
if let nextTrie = trie.children[head] {
var newChildren = trie.children
newChildren[head] = insert(tail, trie: nextTrie)
return Trie(isElem: trie.isElem, children: newChildren)
} else {
var newChildren = trie.children
newChildren[head] = single(tail)
return Trie(isElem: trie.isElem, children: newChildren)
}
} else {
return Trie(isElem: true, children: trie.children)
}
}
func buildString(words: [String]) -> Trie<Character> {
return reduce(words, empty()) { trie, word in
insert([word], trie: trie)
}
}
在buildString
内我得到了这个:
Cannot convert return expression of type Trie<String> to return type Trie<Character>
我该如何解决这个问题?
答案 0 :(得分:2)
假设func empty<T>() -> Trie<T> {
return Trie<T>()
}
看起来像这样
buildString
将func buildString(words: [String]) -> Trie<Character> {
return words.reduce(empty()) { trie, word in
insert(Array(word.characters), trie: trie)
}
}
功能更改为
insert
Character
的第一个参数中您想要的是Array(word.characters)
个实例的数组,您可以通过调用Array(word)
获得这些实例。 [word.characters]
是Swift 1.2的方式,不再适用于Swift 2。另外,reduce
只创建一个包含单个元素的数组(字符串的字符视图),这就是为什么它也不起作用。
请注意,我还将全局.reduce
函数(Swift 1.2方式)更改为实例方法define( 'WP_HTTP_BLOCK_EXTERNAL', TRUE );
(Swift 2方式)。