繁体   English   中英

Swift 错误无法转换“[String.Element]”类型的值(又名“Array<character> ') 到预期的参数类型 '[String]'</character>

[英]Swift Error Cannot convert value of type '[String.Element]' (aka 'Array<Character>') to expected argument type '[String]'

我正在尝试使用以下 Swift 代码从给定的单词创建一个字母数组(我有一个 allWords 的单词数组,但为了简单起见,我现在只是在那里添加了一个示例单词):

let allWords = ["Leopards"]
var arrayOfLetters = Array(allWords[0])

let everyPossibleArrangementOfLetters = permute(list: arrayOfLetters)

func permute(list: [String], minStringLen: Int = 3) -> Set<String> {
    func permute(fromList: [String], toList: [String], minStringLen: Int, set: inout Set<String>) {
        if toList.count >= minStringLen {
            set.insert(toList.joined(separator: ""))
        }
        if !fromList.isEmpty {
            for (index, item) in fromList.enumerated() {
                var newFrom = fromList
                newFrom.remove(at: index)
                permute(fromList: newFrom, toList: toList + [item], minStringLen: minStringLen, set: &set)
            }
        }
    }

    var set = Set<String>()
    permute(fromList: list, toList:[], minStringLen: minStringLen, set: &set)
    return set
}

我从以下位置获得此代码: Calculate all permutations of a string in Swift

但是会出现以下错误:无法将类型“[String.Element]”(又名“Array”)的值转换为预期的参数类型“[String]”

我尝试了以下方法,它有效,但每个单词需要超过 10 秒(取决于重复字母的数量),我希望找到更好的解决方案。

var arrayOfLetters: [String] = []

     for letter in allWords[0] {
     arrayOfLetters.append(String(letter))
     }

     let everyPossibleArrangementOfLetters = permute(list: arrayOfLetters)

我无法使以下解决方案起作用,尽管我认为它有 promise 我无法通过数组中项目的 productID 名称,而我的数组项目未命名... 从 swift 3 迁移到 swift 4 - 无法将 String 转换为预期的 String.Element

我还创建了另一个数组并检查每个单词以确保它们的有效性,并且我遇到了相同的错误,我以与 array.append 相同的方式更正了该错误,这也在该位置增加了更多时间。

var everyPossibleArrangementOfLettersPartDeux: [String] = []
     for word in everyPossibleArrangementOfLetters {
     everyPossibleArrangementOfLettersPartDeux.append(word)
     }

numberOfRealWords = possibleAnagrams(wordArray: everyPossibleArrangementOfLettersPartDeux)

func possibleAnagrams(wordArray: [String]) -> Int {

    func isReal(word: String) -> Bool {
        let checker = UITextChecker()
        let range = NSMakeRange(0, word.utf16.count)
        let misspelledRange = checker.rangeOfMisspelledWord(in: word, range: range, startingAt: 0, wrap: false, language: "en")

        return misspelledRange.location == NSNotFound
    }

    var count = 0

    for word in wordArray {
        if isReal(word: word) {
            count += 1
            //print(word)
        }

        }
        return count
        }

我希望 array.append 的相同替换将在两个位置都有效。

问题是Array(allWords[0])生成[Character]而不是所需的[String]

您可以在String上调用map (这是Character的集合,并在每个字符上使用String.init将其转换为String )。 map的结果为[String]

var arrayOfLetters = allWords[0].map(String.init)

笔记:

  1. 当我在Playground中尝试此操作时,我得到了一条神秘的消息: Fatal error: Only BidirectionalCollections can be advanced by a negative amount 这似乎是一个Playground问题,因为它可以在应用程序中正常工作。
  2. "Leopards"一词就产生109,536个排列。

另一种方法

解决该问题的另一种方法是意识到permute不必对[String]起作用。 它可以改用[Character] 另外,由于您始终以String开头,所以为什么不将该字符串传递给外部permute并让它为您创建[Character]

最后,由于逻辑上认为您可能只想要原始单词的字谜,因此将minStringLen可选值,其值为nil ,如果未指定该值,则仅使用word.count

func permute(word: String, minStringLen: Int? = nil) -> Set<String> {
    func permute(fromList: [Character], toList: [Character], minStringLen: Int, set: inout Set<String>) {
        if toList.count >= minStringLen {
            set.insert(String(toList))
        }
        if !fromList.isEmpty {
            for (index, item) in fromList.enumerated() {
                var newFrom = fromList
                newFrom.remove(at: index)
                permute(fromList: newFrom, toList: toList + [item], minStringLen: minStringLen, set: &set)
            }
        }
    }

    var set = Set<String>()
    permute(fromList: Array(word), toList:[], minStringLen: minStringLen ?? word.count, set: &set)
    return set
}

例子:

print(permute(word: "foo", minStringLen: 1))
 ["of", "foo", "f", "fo", "o", "oof", "oo", "ofo"] 
print(permute(word: "foo"))
 ["foo", "oof", "ofo"] 

此行返回一个Character数组,而不是String数组:

var arrayOfLetters = Array(allWords[0])

您可以将其转换为String数组,如下所示:

var arrayOfLetters = Array(allWords[0]).map{String($0)}

您也可以这样写:

var arrayOfLetters = allWords[0].characters.map{String($0)}

如果,它是可选的字符或字符串

usedLetters.append(currentWord.randomElement().map(String.init)!)

这里usedLetters是Array[String] currentWord是Optional string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM