将字符串转换为Bool并在Swift中测试IF语句

将字符串转换为Bool并在Swift中测试IF语句,swift,Swift,所以我试着获取字符串的第一个索引(全名),并测试它是否匹配所有小写和大写元音。。。出于某种原因,当我使用.startIndex时,我使用If语句一次测试一个字母 有没有一种方法可以一次测试所有元音()我尝试了| |在每个元音之间,它给了我一个错误“无法将字符串转换为布尔”。谢谢你的帮助 func lyricsForName(lyricsTemplate: String, fullName: String) -> String { let shortName = shortName

所以我试着获取字符串的第一个索引(全名),并测试它是否匹配所有小写和大写元音。。。出于某种原因,当我使用.startIndex时,我使用If语句一次测试一个字母

有没有一种方法可以一次测试所有元音()我尝试了| |在每个元音之间,它给了我一个错误“无法将字符串转换为布尔”。谢谢你的帮助

func lyricsForName(lyricsTemplate: String, fullName: String) -> String {

    let shortName = shortNameFromName(name: fullName)
    let index = fullName[fullName.startIndex]
    if index== ("a","A"){

        let lyrics = lyricsTemplate
            .replacingOccurrences(of:"<FULL_NAME>", with: fullName)
            .replacingOccurrences (of:"<SHORT_NAME>", with: fullName )

        return lyrics
    }else{
        let lyrics = lyricsTemplate
            .replacingOccurrences(of:"<FULL_NAME>", with: fullName)
            .replacingOccurrences (of:"<SHORT_NAME>", with: shortName )

        return lyrics
func-lyricsForName(lyricsTemplate:String,fullName:String)->String{
让shortName=shortNameFromName(名称:fullName)
让index=fullName[fullName.startIndex]
如果索引==(“a”、“a”){
让歌词=歌词模板
.replacingOccurrences(of:,with:fullName)
.replacingOccurrences(of:,with:fullName)
返回歌词
}否则{
让歌词=歌词模板
.replacingOccurrences(of:,with:fullName)
.replacingOccurrences(of:,with:shortName)
返回歌词

这里有一种方法。您可以使用元音数组,然后测试数组是否包含第一个字符:

let fullName = "Albert"

let vowels = "aeiouAEIOU".characters    

if let first = fullName.characters.first, vowels.contains(first) {
    print("\(fullName) starts with a vowel")
}
艾伯特以元音开头


注意:使用
fullName.characters.first
fullName[fullName.startIndex]
更安全,因为后者将因空
字符串而崩溃。以下是一种方法。您可以使用元音数组,然后测试数组是否包含第一个字符:

let fullName = "Albert"

let vowels = "aeiouAEIOU".characters    

if let first = fullName.characters.first, vowels.contains(first) {
    print("\(fullName) starts with a vowel")
}
艾伯特以元音开头


注意:使用
fullName.characters.first
fullName[fullName.startIndex]
更安全,因为后者将因空
字符串而崩溃

您可以按照前面的回答进行操作,但这是使用可用API更快捷的方法:

extension String {
    var firstThreeLettersAreVowels: Bool {
        guard characters.count >= 3 else {
            return false
        }

        let firstThreeLetters = substring(to: index(startIndex, offsetBy: 3))
        let isAllVowels = CharacterSet(charactersIn: firstThreeLetters).isSubset(of: CharacterSet.vowels)
        return isAllVowels
    }

    var isLower: Bool {
        return CharacterSet(charactersIn: self).isSubset(of: CharacterSet.lowercaseLetters)
    }

    var isUpper: Bool {
        return CharacterSet(charactersIn: self).isDisjoint(with: CharacterSet.lowercaseLetters)
    }
}

extension CharacterSet {
    static var vowels: CharacterSet {
        return CharacterSet(charactersIn: "AEIOUYaeiouy")
    }
}
或一个衬里(无长度检查)为


这使您可以依赖现有的API,而不是自己尝试完成工作,而且速度应该相当快。

您可以按照前面的回答完成,但这是使用可用API的一种更快捷的方法:

extension String {
    var firstThreeLettersAreVowels: Bool {
        guard characters.count >= 3 else {
            return false
        }

        let firstThreeLetters = substring(to: index(startIndex, offsetBy: 3))
        let isAllVowels = CharacterSet(charactersIn: firstThreeLetters).isSubset(of: CharacterSet.vowels)
        return isAllVowels
    }

    var isLower: Bool {
        return CharacterSet(charactersIn: self).isSubset(of: CharacterSet.lowercaseLetters)
    }

    var isUpper: Bool {
        return CharacterSet(charactersIn: self).isDisjoint(with: CharacterSet.lowercaseLetters)
    }
}

extension CharacterSet {
    static var vowels: CharacterSet {
        return CharacterSet(charactersIn: "AEIOUYaeiouy")
    }
}
或一个衬里(无长度检查)为

这使您可以依赖现有的API,而不是自己动手,而且速度应该非常快。

请大家回答

角色集是他的想法:)

我只是让它更一般化了

import Foundation

extension String {
    func isFirstLetters(count: Int, of characterSet: CharacterSet) -> Bool {

        guard characters.count >= count else {
            return false
        }

        let firstLetters = substring(to: index(startIndex, offsetBy: count))
        let isInSubset = CharacterSet(charactersIn: firstLetters).isSubset(of: characterSet

        )
        return isInSubset
    }
}

extension CharacterSet {
    static var vowels: CharacterSet {
        return CharacterSet(charactersIn: "AEIOUYaeiouy")
    }
}
一些测试用例:

"abcDEf".isFirstLetters(count: 3, of: .vowels) // false
"aioDEf".isFirstLetters(count: 3, of: .vowels) // true

"abcDEf".isFirstLetters(count: 1, of: .vowels) // true
"bbcDEf".isFirstLetters(count: 1, of: .vowels) // false
"ibcDEf".isFirstLetters(count: 1, of: .vowels) // true

"ABcdef".isFirstLetters(count: 3, of: .uppercaseLetters) // false
"ABDdef".isFirstLetters(count: 3, of: .uppercaseLetters) // true

"abBABcdef".isFirstLetters(count: 3, of: .lowercaseLetters) // false
"abbABDdef".isFirstLetters(count: 3, of: .lowercaseLetters) // true


"ABD".isFirstLetters(count: 3, of: CharacterSet(charactersIn: "A"..."C")) // false
"ABD".isFirstLetters(count: 3, of: CharacterSet(charactersIn: "A"..."D")) // true
调试信息:

extension CharacterSet {
    var characters: [Character] {
        var result: [Character] = []
        for plane: UInt8 in 0...16 where self.hasMember(inPlane: plane) {
            for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 {
                if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
                    result.append(Character(uniChar))
                }
            }
        }
        return result
    }
}



print(CharacterSet.uppercaseLetters.description)
//<Foundation._SwiftNSCharacterSet: 0x6000000271a0>

print(String(CharacterSet.vowels.characters))
//AEIOUYaeiouy

print(CharacterSet.vowels.characters)
// ["A", "E", "I", "O", "U", "Y", "a", "e", "i", "o", "u", "y"]
扩展字符集{
变量字符:[字符]{
变量结果:[字符]=[]
对于0…16中的平面:UInt8,其中self.hasMember(平面内:平面){
对于UInt32(平面)中的unicode所有荣誉,请回答

角色集是他的想法:)

我只是让它更一般化了

import Foundation

extension String {
    func isFirstLetters(count: Int, of characterSet: CharacterSet) -> Bool {

        guard characters.count >= count else {
            return false
        }

        let firstLetters = substring(to: index(startIndex, offsetBy: count))
        let isInSubset = CharacterSet(charactersIn: firstLetters).isSubset(of: characterSet

        )
        return isInSubset
    }
}

extension CharacterSet {
    static var vowels: CharacterSet {
        return CharacterSet(charactersIn: "AEIOUYaeiouy")
    }
}
一些测试用例:

"abcDEf".isFirstLetters(count: 3, of: .vowels) // false
"aioDEf".isFirstLetters(count: 3, of: .vowels) // true

"abcDEf".isFirstLetters(count: 1, of: .vowels) // true
"bbcDEf".isFirstLetters(count: 1, of: .vowels) // false
"ibcDEf".isFirstLetters(count: 1, of: .vowels) // true

"ABcdef".isFirstLetters(count: 3, of: .uppercaseLetters) // false
"ABDdef".isFirstLetters(count: 3, of: .uppercaseLetters) // true

"abBABcdef".isFirstLetters(count: 3, of: .lowercaseLetters) // false
"abbABDdef".isFirstLetters(count: 3, of: .lowercaseLetters) // true


"ABD".isFirstLetters(count: 3, of: CharacterSet(charactersIn: "A"..."C")) // false
"ABD".isFirstLetters(count: 3, of: CharacterSet(charactersIn: "A"..."D")) // true
调试信息:

extension CharacterSet {
    var characters: [Character] {
        var result: [Character] = []
        for plane: UInt8 in 0...16 where self.hasMember(inPlane: plane) {
            for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 {
                if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
                    result.append(Character(uniChar))
                }
            }
        }
        return result
    }
}



print(CharacterSet.uppercaseLetters.description)
//<Foundation._SwiftNSCharacterSet: 0x6000000271a0>

print(String(CharacterSet.vowels.characters))
//AEIOUYaeiouy

print(CharacterSet.vowels.characters)
// ["A", "E", "I", "O", "U", "Y", "a", "e", "i", "o", "u", "y"]
扩展字符集{
变量字符:[字符]{
变量结果:[字符]=[]
对于0…16中的平面:UInt8,其中self.hasMember(平面内:平面){

对于UInt32(平面)索引中的unicode,它不是字符的好名称。
if-String(fullName.characters.prefix(1)).uppercased()=“a”
mhhh有意思的问题。但为什么需要它?索引它不是字符的好名称。
if-String(fullName.characters.prefix(1)).uppercased()=“a”
mhh这是一个有趣的问题。但是你为什么需要它呢?还有
fullName.characters。首先,大写的
元音可以减半排列
fullName.characters。首先,大写的
元音可以减半排列
我不认为这是一个打字错误
e
意思是
无论如何,这个保护是错误的de>guard characters.count>=3个else
应该检查它是否少于3个字母
guard characters.count<3个else
这个守卫是正确的。哦,对不起-我弄错了-是的,你是对的-我忘记了它应该是真的,否则它会执行
else
并且
如果
chars.count
其中一个
0,1,2
它认为这是一个打字错误
e
的意思是
这个警卫是错的
警卫字符。计数>=3个其他的
应该检查一下,少于3个字母
警卫字符。计数<3个其他的
警卫是正确的。哦,对不起-我弄错了-是的,你是对的-我忘了它应该是真的,其他的如果
chars.count
中的一个
0,1,2