亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用SWIFT編程語言獲取字符串的第n個字符

用SWIFT編程語言獲取字符串的第n個字符

絕地無雙 2019-06-20 11:09:20
用SWIFT編程語言獲取字符串的第n個字符我怎樣才能得到字符串的第n個字符?我試過支架([])沒有運氣的訪問者。var string = "Hello, world!"var firstChar = string[0] // Throws error錯誤:“下標”不可用:不能用Int下標字符串,有關討論,請參閱文檔注釋
查看完整描述

3 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

注意:請看利奧·達布斯的回答對于SWIFT 4的適當實現。

SWIFT 4

這個Substring在SWIFT 4中引入了類型,以便通過與原始字符串共享存儲,使子字符串更快、更高效,因此下標函數應該返回該類型。

試試看這里

extension String {
  subscript (i: Int) -> Character {
    return self[index(startIndex, offsetBy: i)]
  }
  subscript (bounds: CountableRange<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[start ..< end]
  }
  subscript (bounds: CountableClosedRange<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[start ... end]
  }
  subscript (bounds: CountablePartialRangeFrom<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(endIndex, offsetBy: -1)
    return self[start ... end]
  }
  subscript (bounds: PartialRangeThrough<Int>) -> Substring {
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[startIndex ... end]
  }
  subscript (bounds: PartialRangeUpTo<Int>) -> Substring {
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[startIndex ..< end]
  }}extension Substring {
  subscript (i: Int) -> Character {
    return self[index(startIndex, offsetBy: i)]
  }
  subscript (bounds: CountableRange<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[start ..< end]
  }
  subscript (bounds: CountableClosedRange<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[start ... end]
  }
  subscript (bounds: CountablePartialRangeFrom<Int>) -> Substring {
    let start = index(startIndex, offsetBy: bounds.lowerBound)
    let end = index(endIndex, offsetBy: -1)
    return self[start ... end]
  }
  subscript (bounds: PartialRangeThrough<Int>) -> Substring {
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[startIndex ... end]
  }
  subscript (bounds: PartialRangeUpTo<Int>) -> Substring {
    let end = index(startIndex, offsetBy: bounds.upperBound)
    return self[startIndex ..< end]
  }}

若要轉換Substring變成String,你可以簡單地做String(string[0..2]),但只有當您計劃保留子字符串時,才應該這樣做。否則,將其保持為Substring.

如果有人能想出一個很好的方法把這兩個擴展合并成一個,那就太好了。我試著擴展StringProtocol沒有成功,因為index方法不存在。

 

SWIFT 3:

extension String {
  subscript (i: Int) -> Character {
    return self[index(startIndex, offsetBy: i)]
  }
  subscript (i: Int) -> String {
    return String(self[i] as Character)
  }
  subscript (r: Range<Int>) -> String {
    let start = index(startIndex, offsetBy: r.lowerBound)
    let end = index(startIndex, offsetBy: r.upperBound)
    return self[Range(start ..< end)]
  }}

 

為什么這不是內置的?

Apple提供了以下解釋(在這里發現的):

帶有整數的子腳本字符串不可用。

i字符串中的TH字符在不同的庫和系統組件中有不同的解釋。正確的解釋應該根據用例和所涉及的api選擇,所以String不能用整數訂閱。

SWIFT提供了幾種訪問字符串中存儲的字符數據的不同方法。

  • String.utf8是字符串中UTF-8代碼單元的集合。將字符串轉換為UTF-8時使用此API。大多數POSIX API以UTF-8代碼單元處理字符串。

  • String.utf16是字符串中UTF-16代碼單元的集合。大多數Cocoa和CocoaTouch API根據UTF-16代碼單元處理字符串。例如,NSRange與.連用NSAttributedStringNSRegularExpression以UTF-16碼單元存儲子字符串偏移量和長度。

  • String.unicodeScalars是Unicode標量的集合。當您執行字符數據的低級別操作時,請使用此API。

  • String.characters是一組擴展的字素聚類,它是用戶感知字符的近似。

請注意,在處理包含可讀的文本的字符串時,應盡可能避免逐字符處理。例如,使用高級別的對地區敏感的Unicode算法,String.localizedStandardCompare(),String.localizedLowercaseStringString.localizedStandardRangeOfString()等。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 2189 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號