2017-09-14 109 views
1

lyricsForName函数不打印任何东西。 shortNameFromName确实有效,我检查了第二个功能有什么问题。lyricsForName函数不打印任何东西

func shortNameFromName(name : String) ->String{ 
    var shortName = "" 

    let lowercaseNmae = name.lowercased() 
    let vowelSet = CharacterSet(charactersIn: "aeiou") 
    if let range = lowercaseNmae.rangeOfCharacter(from: vowelSet, options: String.CompareOptions.caseInsensitive) 
    { 
     shortName = name.substring(from: range.lowerBound) 
    } 

    return shortName 
} 

func lyricsForName(lyricsTemplate : String , fullName : String) ->String{ 
    let bananaFanaTemplate = ["<FULL_NAME>, <FULL_NAME>, Bo B<SHORT_NAME", 
          "Banana Fana Fo F<SHORT_NAME>", 
          "Me My Mo M<SHORT_NAME>", 
          "<FULL_NAME>"].joined(separator: "\n") 
    let shortName = shortNameFromName(name: fullName) 
    let lyrics = lyricsTemplate 
     .replacingOccurrences(of: "<FULL_NAME>", with: fullName) 
     .replacingOccurrences(of: "<SHORT_NAME>", with: shortName) 

    print(lyricsForName(lyricsTemplate:bananaFanaTemplate , fullName: "vishnu")) 

    return lyrics 
} 

第一个功能完美的工作,但我想第二个功能不能正常工作。我应该怎么做才能使它工作?

+0

你好 - 你的函数应该是递归的(你在函数声明中调用lyricsForName)?如果您打印歌词,会发生什么情况? – Sparky

+0

它不应该递归 – vishnu

+0

我现在在外面使用该函数它只打印\ n,相同的结果,当我尝试打印歌词 – vishnu

回答

0

我现在在我的办公桌上,所以快速查看了您的代码。这就是现在的工作(注意bananaFanaTemplate错字):

func shortNameFromName(name : String) ->String{ 
    var shortName = "" 

    let lowercaseNmae = name.lowercased() 
    let vowelSet = CharacterSet(charactersIn: "aeiou") 
    if let range = lowercaseNmae.rangeOfCharacter(from: vowelSet, options: String.CompareOptions.caseInsensitive) { 
      shortName = name.substring(from: range.lowerBound) 
    } 

    return shortName 
} 

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

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

    print(lyrics) 

    return lyrics 
} 

let bananaFanaTemplate : String = ["<FULL_NAME>, <FULL_NAME>, Bo B<SHORT_NAME>", 
           "Banana Fana Fo F<SHORT_NAME>", 
           "Me My Mo M<SHORT_NAME>", 
           "<FULL_NAME>"].joined(separator: "\n") 

print(lyricsForName(lyricsTemplate:bananaFanaTemplate , fullName: "vishnu")) 

输出:

毗湿奴,毗湿奴,博比什努 香蕉烦啊佛Fishnu 我我莫Mishnu 毗湿奴

我认为你是对功能范围问题颇为困惑。您在函数的实现中声明了常量bananaFanaTemplate,其中该参数应该已传递给该函数。同样,你从函数体内调用函数,除非它是一个递归函数,否则你通常不会这样做。

看看:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

希望有所帮助。