Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 辅音和元音_Ios_Swift_Swift2_Swift Playground - Fatal编程技术网

Ios 辅音和元音

Ios 辅音和元音,ios,swift,swift2,swift-playground,Ios,Swift,Swift2,Swift Playground,我是Swift的新手,有人能解释一下为什么我总是遇到这个问题吗。我使用的是Xcode 6.4,但这里有一个问题,我希望我能解决它,但我需要我的函数来接收大字符串,然后返回元组(numowels,numConsonants) 计算以辅音/元音开头的单词数 返回元组并打印函数调用的结果。 我不需要它计算字符,只需要每个单词的第一个字符。我创建了一个for循环,它将所有内容切换为小写。但现在我被卡住了 func count(string: String) -> (Vowels:Int, Cons

我是Swift的新手,有人能解释一下为什么我总是遇到这个问题吗。我使用的是Xcode 6.4,但这里有一个问题,我希望我能解决它,但我需要我的函数来接收大字符串,然后返回元组(numowels,numConsonants) 计算以辅音/元音开头的单词数 返回元组并打印函数调用的结果。 我不需要它计算字符,只需要每个单词的第一个字符。我创建了一个for循环,它将所有内容切换为小写。但现在我被卡住了

func count(string: String) -> (Vowels:Int, Consonants:Int) {
    var Vowels = 0, Consonants = 0
    for character in string {
        switch String(character).lowercaseString {
            case "a","e","i","o","u":
              ++Vowels
            case "b","c","d","e","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
            ++Consonants
        default: break
        }

    }
    return (Vowels, Consonants)
}

问题在于您为方法选择的名称。试试除计数之外的任何名字,你应该会没事的

编辑/更新:Swift 4

func countCharacteres(_ string: String) -> (vowels: Int, consonants: Int) {
    var vowels = 0, consonants = 0
    for character in string {
        switch String(character).lowercased() {
        case "a","e","i","o","u":
            vowels += 1
        case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
            consonants += 1
        default:
            break
        }
    }
    return (vowels, consonants)
}


如果只想计算每个单词的第一个字母,则需要将字符串拆分为一个单词数组,并提取每个第一个字母的小写字母,如下所示:

extension StringProtocol where Index == String.Index {
    var range: Range<Index> { return startIndex..<endIndex }
    var words: [String] {
        var words: [String] = []
        enumerateSubstrings(in: range, options: .byWords) { word, _, _, _ in words.append(word!) }
        return words
    }
}
extension StringProtocol  where Index == String.Index {
    var firstCharacterCount: (vowels: Int, consonants: Int) {
        var vowels = 0, consonants = 0
        for first in words.compactMap({$0.lowercased().first}) {
            switch first {
            case "a","e","i","o","u":
                vowels += 1
            case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
                consonants += 1
            default: break
            }
        }
        return (vowels, consonants)
    }
}

请注意,扩展名应放在项目内的新Swift文件中。

如果使用Swift 2:

换一行就行了

for character in string {

这样就行了

count("hello") // (.0 2, .1 3)

另一种选择是使用正则表达式检索每个单词的第一个字母。
\b
选项用于查找单词边界,
\w
是单个单词字符。因此,一旦您避开后斜杠,
\\b\\w
将捕获紧跟在单词边界之后的第一个字母(也称为每个单词的第一个字母):

--

如果要处理重音字符(如“étude”),可能需要先删除这些变音符号:

func countLetters(string: String) -> (vowels: Int, consonants: Int) {
    let convertedString = NSMutableString(string: string)
    CFStringTransform(convertedString, nil, kCFStringTransformStripCombiningMarks, Boolean(0))

    var vowels = 0, consonants = 0
    let regex = NSRegularExpression(pattern: "\\b\\w", options: nil, error: nil)
    regex?.enumerateMatchesInString(convertedString as String, options: nil, range: NSMakeRange(0, convertedString.length)) { matches, flags, stop in
        switch convertedString.substringWithRange(matches.range).lowercaseString {
        case "a","e","i","o","u":
            ++vowels
        case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
            ++consonants
        default: break
        }
    }
    return (vowels, consonants)
}

您是否在XCode 7 beta 5中使用swift 2?我在XCode中使用swift从目前提供的答案来看,我认为没有人正确理解您的问题。请澄清。请给出一个输入示例,您从输出中得到了什么,以及您对输出的期望值。您能澄清一下您到底想做什么吗?@JetLagg请将这些澄清整合到原始问题中。单击问题下方的“编辑”,然后更新原始问题。我读到他的问题时说“我正在统计所有字母的数量,我只想要每个单词的第一个字母。”我想你回答的是另一个问题。@Rob你是对的。但他仍然需要为他的方法选择另一个名称。也许这是他的主要问题别误会我:我同意他最好改名。这与问题无关,伊姆霍。事实上没有@LeoDabus,看我的答案。但问题仍然不够清楚。谢谢大家,这就是我需要将字符串和单词数组@LyndseyScott,LeoDabusThis分解成的内容。这是正确的,如果他想将其转换为Swift 2,他会这样做。但我认为这不是当前的问题。
for character in string.characters {
count("hello") // (.0 2, .1 3)
func countLetters(string: String) -> (vowels: Int, consonants: Int) {
    var vowels = 0, consonants = 0
    let regex = NSRegularExpression(pattern: "\\b\\w", options: nil, error: nil)
    regex?.enumerateMatchesInString(string, options: nil, range: NSMakeRange(0, count(string))) { matches, flags, stop in
        switch (string as NSString).substringWithRange(matches.range).lowercaseString {
        case "a","e","i","o","u":
            ++vowels
        case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
            ++consonants
        default: break
        }
    }
    return (vowels, consonants)
}
func countLetters(string: String) -> (vowels: Int, consonants: Int) {
    let convertedString = NSMutableString(string: string)
    CFStringTransform(convertedString, nil, kCFStringTransformStripCombiningMarks, Boolean(0))

    var vowels = 0, consonants = 0
    let regex = NSRegularExpression(pattern: "\\b\\w", options: nil, error: nil)
    regex?.enumerateMatchesInString(convertedString as String, options: nil, range: NSMakeRange(0, convertedString.length)) { matches, flags, stop in
        switch convertedString.substringWithRange(matches.range).lowercaseString {
        case "a","e","i","o","u":
            ++vowels
        case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
            ++consonants
        default: break
        }
    }
    return (vowels, consonants)
}