xcode 无法推断通用参数“Self”(swift 4)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/48112544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 10:30:35  来源:igfitidea点击:

Generic parameter 'Self' could not be inferred (swift 4)

xcodeswift4

提问by Haiyuan

I want to make a substring extension for string , I tried below 2 ways but unsuccessful:

我想为 string 做一个子字符串扩展,我尝试了以下两种方法但没有成功:

extension String
{
    func substringToFirstChar(of char: Character) -> String
    {
        let pos = self.range(of: String(char))
        let subString = self[..<pos?.lowerBound]   
        return String(subString)
    }
}

or

或者

extension String
{
    func substringToFirstChar(of char: Character) -> String
    {
        let pos = self.index(of: char)
        let subString = self[..<pos]
        return String(subString)
    }
}

xcode prompt error: Generic parameter 'Self' could not be inferredat the "let subString = self[.." line.

xcode 提示错误: 无法在“ let subString = self[..”行推断通用参数“Self”

How to do that ?

怎么做 ?

回答by vadian

range(of/ index(ofreturns an optional. You have to unwrap the optional in the range expression

range(of/index(of返回一个可选的。您必须在范围表达式中解开可选项

extension String
{
    func substringToFirstChar(of char: Character) -> String?
    {
        guard let pos = self.range(of: String(char))?.lowerBound else { return nil }
        // or  guard let pos = self.index(of: char) else { return nil }
        let subString = self[..<pos]
        return String(subString)
    }
}

alternatively – to avoid the optional – return the unchanged string if there is no match

或者 - 避免可选 - 如果没有匹配,则返回未更改的字符串

extension String
{
    func substringToFirstChar(of char: Character) -> String
    {
        guard let pos = self.range(of: String(char))?.lowerBound else { return self }
        // or  guard let pos = self.index(of: char) else { return self }
        let subString = self[..<pos]
        return String(subString)
    }
}