如何在Swift 4中使用字符串切片下标?

Adr*_*ian 286 swift swift4

我有以下用Swift 3编写的简单代码:

let str = "Hello, playground"
let index = str.index(of: ",")!
let newStr = str.substring(to: index)
Run Code Online (Sandbox Code Playgroud)

从Xcode 9 beta 5,我得到以下警告:

' substring(to:)'已被弃用:请使用String带有'partial range from'运算符的切片下标.

如何在Swift 4中使用具有部分范围的切片下标

Tam*_*gel 353

你应该将一边留空,因此名称为"部分范围".

let newStr = str[..<index]
Run Code Online (Sandbox Code Playgroud)

同样代表运营商的部分范围,只是将对方留空:

let newStr = str[index...]
Run Code Online (Sandbox Code Playgroud)

请记住,这些范围运算符返回a Substring.如果要将其转换为字符串,请使用String初始化函数:

let newStr = String(str[..<index])
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关新子串的更多信息.

  • @ConfusionTowers,[Swift字符串索引不是整数](/sf/answers/1743375651/),并且版本4没有改变.你可能需要`str [.. <str. index(str.startIndex,offsetBy:8)]`或类似的东西.请记住,`str.index`是`offsetBy`函数的**线性时间**操作. (22认同)
  • 使用字符串插值和单独的`Substring`可能有点令人困惑,因为你真正想要完成的是`String`初始化:`let newStr = String(str [.. <index])`. (12认同)
  • `str [.. <index]`返回一个`Substring`.如果你想`newStr`是`String`你必须写:`let newStr ="\(str [.. <index])"` (8认同)
  • @zneak你可能想要`str.prefix(8)` (6认同)
  • 更新我的'index'值只是一个整数的代码会产生一条错误消息,`不能下载类型'String'的值,其索引类型为'PartialRangeUpTo <Int>'`.那里必须使用哪些类型的值? (5认同)
  • 丑陋的语法.讨厌这样的表达式:!一个!! a?aa?[.. <index] [索引......]超级难以置信!!! (5认同)
  • 为什么 Swift 要让事情变得如此复杂?Python 的字符串操作好多了 `str = "Hello Python" print(str[0:2])` 结果是 "He" (2认同)

Moh*_*goo 255

将子串(Swift 3)转换为字符串切片(Swift 4)

示例在Swift 3,4中:

let newStr = str.substring(to: index) // Swift 3
let newStr = String(str[..<index]) // Swift 4
Run Code Online (Sandbox Code Playgroud)
let newStr = str.substring(from: index) // Swift 3
let newStr = String(str[index...]) // Swift 4 
Run Code Online (Sandbox Code Playgroud)
let range = firstIndex..<secondIndex // If you have a range
let newStr = = str.substring(with: range) // Swift 3
let newStr = String(str[range])  // Swift 4
Run Code Online (Sandbox Code Playgroud)

  • Perfecto,并感谢并排提供3和4个示例,使我的项目更容易更新! (5认同)

dim*_*iax 67

斯威夫特4

用法

let text = "Hello world"
text[0] // H
text[...3] // "Hell"
text[6..<text.count] // world
text[NSRange(location: 6, length: 3)] // wor
Run Code Online (Sandbox Code Playgroud)

import Foundation

public extension String {
  subscript(value: Int) -> Character {
    self[index(at: value)]
  }
}

public extension String {
  subscript(value: NSRange) -> Substring {
    self[value.lowerBound..<value.upperBound]
  }
}

public extension String {
  subscript(value: CountableClosedRange<Int>) -> Substring {
    self[index(at: value.lowerBound)...index(at: value.upperBound)]
  }

  subscript(value: CountableRange<Int>) -> Substring {
    self[index(at: value.lowerBound)..<index(at: value.upperBound)]
  }

  subscript(value: PartialRangeUpTo<Int>) -> Substring {
    self[..<index(at: value.upperBound)]
  }

  subscript(value: PartialRangeThrough<Int>) -> Substring {
    self[...index(at: value.upperBound)]
  }

  subscript(value: PartialRangeFrom<Int>) -> Substring {
    self[index(at: value.lowerBound)...]
  }
}

private extension String {
  func index(at offset: Int) -> String.Index {
    index(startIndex, offsetBy: offset)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 此功能应该是默认的快速行为. (10认同)
  • 绝对PR到Swift lib:D (4认同)
  • 这是对 Swift 最丑陋部分的修复。 (2认同)

iln*_*nur 36

Swift 4中的缩写:

var string = "123456"
string = String(string.prefix(3)) //"123"
string = String(string.suffix(3)) //"456"
Run Code Online (Sandbox Code Playgroud)


小智 24

您可以通过以下方式将代码转换为Swift 4:

let str = "Hello, playground"
let index = str.index(of: ",")!
let substr = str.prefix(upTo: index)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码获得一个新字符串:

let newString = String(str.prefix(upTo: index))
Run Code Online (Sandbox Code Playgroud)


Den*_*Den 15

substring(from:index) 转换为 [index ...]

检查样品

let text = "1234567890"
let index = text.index(text.startIndex, offsetBy: 3)

text.substring(from: index) // "4567890"   [Swift 3]
String(text[index...])      // "4567890"   [Swift 4]
Run Code Online (Sandbox Code Playgroud)


Aug*_*Lin 13

迅捷5

(Java的子字符串方法):

extension String {
    func subString(from: Int, to: Int) -> String {
       let startIndex = self.index(self.startIndex, offsetBy: from)
       let endIndex = self.index(self.startIndex, offsetBy: to)
       return String(self[startIndex...endIndex])
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var str = "Hello, Nick Michaels"
print(str.subString(from:7,to:20))
// print Nick Michaels
Run Code Online (Sandbox Code Playgroud)

  • 在 Swift 5 中仍然有效。我正在寻找一个 Java 风格的子字符串(`from` 到 `to-1`,例如 `"Hello".substring(1,4)` 返回“ell”)。通过一个小的修改(`startIndex..&lt;endIndex`),这是我迄今为止找到的最好的解决方案,只需几行代码就可以做到这一点。 (2认同)

Joh*_*nes 8

一些有用的扩展:

extension String {
    func substring(from: Int, to: Int) -> String {
        let start = index(startIndex, offsetBy: from)
        let end = index(start, offsetBy: to - from)
        return String(self[start ..< end])
    }

    func substring(range: NSRange) -> String {
        return substring(from: range.lowerBound, to: range.upperBound)
    }
}
Run Code Online (Sandbox Code Playgroud)


Vla*_*lad 6

uppercasedFirstCharacterSwift3和Swift4中的便利属性示例.

属性uppercasedFirstCharacterNew演示了如何在Swift4中使用String切片下标.

extension String {

   public var uppercasedFirstCharacterOld: String {
      if characters.count > 0 {
         let splitIndex = index(after: startIndex)
         let firstCharacter = substring(to: splitIndex).uppercased()
         let sentence = substring(from: splitIndex)
         return firstCharacter + sentence
      } else {
         return self
      }
   }

   public var uppercasedFirstCharacterNew: String {
      if characters.count > 0 {
         let splitIndex = index(after: startIndex)
         let firstCharacter = self[..<splitIndex].uppercased()
         let sentence = self[splitIndex...]
         return firstCharacter + sentence
      } else {
         return self
      }
   }
}

let lorem = "lorem".uppercasedFirstCharacterOld
print(lorem) // Prints "Lorem"

let ipsum = "ipsum".uppercasedFirstCharacterNew
print(ipsum) // Prints "Ipsum"
Run Code Online (Sandbox Code Playgroud)


Chh*_*eng 6

您可以使用类String的扩展创建自定义subString方法,如下所示:

extension String {
    func subString(startIndex: Int, endIndex: Int) -> String {
        let end = (endIndex - self.count) + 1
        let indexStartOfText = self.index(self.startIndex, offsetBy: startIndex)
        let indexEndOfText = self.index(self.endIndex, offsetBy: end)
        let substring = self[indexStartOfText..<indexEndOfText]
        return String(substring)
    }
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*aha 5

使用Swift 4从String创建SubString(前缀和后缀):

let str : String = "ilike"
for i in 0...str.count {
    let index = str.index(str.startIndex, offsetBy: i) // String.Index
    let prefix = str[..<index] // String.SubSequence
    let suffix = str[index...] // String.SubSequence
    print("prefix \(prefix), suffix : \(suffix)")
}
Run Code Online (Sandbox Code Playgroud)

输出量

prefix , suffix : ilike
prefix i, suffix : like
prefix il, suffix : ike
prefix ili, suffix : ke
prefix ilik, suffix : e
prefix ilike, suffix : 
Run Code Online (Sandbox Code Playgroud)

如果要在两个索引之间生成子字符串,请使用:

let substring1 = string[startIndex...endIndex] // including endIndex
let subString2 = string[startIndex..<endIndex] // excluding endIndex
Run Code Online (Sandbox Code Playgroud)