【问题标题】:How to extract a string from a string in Swift 1.2?如何从 Swift 1.2 中的字符串中提取字符串?
【发布时间】:2015-04-27 07:52:14
【问题描述】:

我有一个字符串类型:“Lorem ipsum dolor sit amet, his ipsum maiestatis in, has in odio sapientem temporibus, ea reque accumsan euripidis vis. Posse consectetuer te his, te per possit gloriatur"TEN_WHITE_SPACES"constituto, et ius amet feugiat dolores. Eam simul nominavi et, graece tractatos qui ea,vim nisl lucilius contentiones ne."SIX_WHITE_SPACES"Movet Labores ex sed, detracto platonem splendide an est, postea fastidii eos ex. Iudico regione diceret mei no, ei homero fuisset voluptaria nec,有施虐方式。”

字符串:“构成,et ius amet feugiat dolores。Eam simul nominavi et, graece tractatos qui ea,vim nisl lucilius contentiones ne。”以开头分隔:“”(10 个空格)和结尾:“”(6 个空格)是我需要提取并加粗的标题。 我可以用 NSAttributedString 做粗体部分,但是我无法弄清楚提取部分。

我为 Swift 1.2 尝试了以下 SO 解决方案:

ERROR: Cannot invoke 'Split' with an argument list of type '((String)),'...

//fullName is declared somewhere alse as NSString, then as String but always the same error
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

如果我改为使用:

var fullName = "First Last and bla bla bla..."

它以某种方式工作......但是当使用预定义的变量时它不起作用。

我也试过: Full split function...

let bits = split(fullName, maxSplit: Int.max, allowEmptySlices: false,
             isSeparator: { $0 == " "})

并得到类似的错误:“无法调用...”

我也尝试过使用:

var allContentStringsBeforeBoldTextArray = temporaryContent.componentsSeparatedByString("              ")
    var boldContent = allContentStringsBeforeBoldTextArray[0].componentsSeparatedByString("        ")

    println(" String count   \(allContentStringsBeforeBoldTextArray.count)")
    println(" Bold string count   \(boldContent.count)")

我得到arrayCount = 1,而不是得到2的数组计数,在某处我丢失了字符串的另一半。

老实说,我不敢相信对于像字符串(字符数组)这样的一个简单对象,苹果有这么多类......来自字符串、NSString、NSAttributedString。并且这些类中的每一个对于相同的操作都没有相同的方法名称。我是 Swift 新手,但它过于复杂。

更新 1

测试代码:

    override func viewDidLoad()
{
    super.viewDidLoad()

    // goal string = "HEADER"

    var startingStringSeparator = "          " // 10 whitespaces
    var endingHeaderSeparator = "      " // 6 whitespace

    var exampleStringNS:NSString = "Lorem ipsum dolor sit amet, his in ipsum latine, duo no quod vocent delenit. Mei nibh eros ut, elit ancillae ei cum,          HEADER      omnium cotidieque liberavisse his te. Aeque elitr ne cum, vis eu cibo ornatus alienum."

     var exampleStringSwift:String = "Lorem ipsum dolor sit amet, his in ipsum latine, duo no quod vocent delenit. Mei nibh eros ut, elit ancillae ei cum,          HEADER      omnium cotidieque liberavisse his te. Aeque elitr ne cum, vis eu cibo ornatus alienum."

    // *
    // 1. TEST RUN

    var splitResultString = split(exampleStringSwift as String) {$0 == startingStringSeparator}
    // ERROR: Cannot invoke split with argument list of type (String,(...)->...)"    
    // *

    // **
    // 2. TEST RUN
    var fullName = "First Last and bla          bla bla..."
    var fullNameArr = split(fullName) {$0 == " "}
    var firstName: String = fullNameArr[0]
    var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

    println(firstName)
    println(lastName)
    // OUTPUT LINE1: First
    // OUTPUT LINE2: Optional("Last")
    // **

    //***
    // 3. TEST RUN - same as TEST RUN 2 but with 10 whitespaces

    var fullNameArr1 = split(fullName) {$0 == "          "}
    var firstName1: String = fullNameArr1[0]
    var lastName1: String? = fullNameArr1.count > 1 ? fullNameArr1[1] : nil

    println(firstName1)
    println(lastName2)
    // ERROR: Cannot invoke split with argument list of type (String,(...)->...)"
    // ***

}

更新 2:

一般工作解决方案:

    override func viewDidLoad()
{
    super.viewDidLoad()

    // goal string = "HEADER"

    var startingStringSeparator = "          " // 10 whitespaces
    var endingHeaderSeparator = "      " // 6 whitespace

    var exampleStringNS:NSString = "Lorem ipsum dolor sit amet, his in ipsum latine, duo no quod vocent delenit. Mei nibh eros ut, elit ancillae ei cum,          HEADER      omnium cotidieque liberavisse his te. Aeque elitr ne cum, vis eu cibo ornatus alienum."

    var exampleStringSwift:String = "Lorem ipsum dolor sit amet, his in ipsum latine, duo no quod vocent delenit. Mei nibh eros ut, elit ancillae ei cum,          HEADER      omnium cotidieque liberavisse his te. Aeque elitr ne cum, vis eu cibo ornatus alienum."

    // *
    // 1. TEST RUN

    var exampleStringNS_Arr = exampleStringSwift.componentsSeparatedByString(startingStringSeparator)
    var exampleStringNS_BoldText_Arr = exampleStringNS_Arr[1].componentsSeparatedByString(endingHeaderSeparator)

    println(exampleStringNS_Arr[0])
    println(exampleStringNS_Arr[1])

    println(" **** ")
    println(exampleStringNS_BoldText_Arr[0])
    println(" **** ")
    //
    // *
}

此解决方案有效,但不适用于我的情况。原因是我的 JSON 解析的文本格式不一致。我使用了错误的方法。 split 只能基于一个字符进行拆分,而不是一个字符数组(字符串)。感谢@Martin R 清除了这一点并为我指明了正确的方向。

【问题讨论】:

  • “它以某种方式工作......但是当使用预定义的变量时它不起作用。”你能发布一个(小)自包含 说明问题的例子? – “并得到类似的错误:“无法调用...””请发布完整的确切错误消息。
  • 如果 fullNameArr 是一个 Swift 字符串,你的第一个例子应该都可以工作。如果它是一个 NSString,那么你必须明确地转换它,例如var fullNameArr = split(fullName as String) {$0 == " "}.
  • 再次阅读您的问题,在我看来split() 是这里的错误工具。使用rangeOfString 查找 TEN_WHITE_SPACES/SIX_WHITE_SPACES 或使用正则表达式可能会更好。也许你可以使用这个:stackoverflow.com/a/29602677/1187415.
  • 好的,使用: var allContentStringsBeforeBoldTextArray = split(contetConvertedString as String) {$0 == " "} 给我错误:“不能使用类型参数列表调用拆分 (String,(...) ->...)"
  • 好的,现在你已经展示了真正的问题。 split(exampleStringSwift as String) {$0 == startingStringSeparator} 不起作用,因为 split() 只能分隔 单个字符,而不是字符串。正如我上面所说,它可能是这里的错误工具。

标签: string swift ios8


【解决方案1】:

您可以使用 substringWithRange 方法。它需要一个开始和结束 String.Index。

var str = "Hello, playground"
    str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex)) //"Hello, playground

你仍然可以在 NSRange 中使用 NSString 方法,但你必须确保你使用的是这样的 NSString:

let myNSString = str as NSString
myNSString.substringWithRange(NSRange(location: 0, length: 3))

试试这个。这可以帮助您从字符串中提取字符串。

编辑的部分你会得到角色的位置

var loc = "abcdefghi".rangeOfString("c").location
NSLog("%d", loc);

这也有效,

var myRange: NSRange = "abcdefghi".rangeOfString("c")
var loc = myRange.location
NSLog("%d", loc);

【讨论】:

  • 我已经做了这样的事情,但在这种情况下,我需要找到字符串的正确位置。您可以使用查找索引的功能来编辑答案吗?我目前正在尝试让拆分功能工作,如果可能的话(就我而言)
  • 我会试试的。希望它适用于“ccc”(多个字符)。
  • var str:String = "Hello, playground" let range = Range(start:advance(str.startIndex,1), end:advance(str.startIndex,8)) //它会返回你“你好,p”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2012-03-03
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多