![](/img/trans.png)
[英]How do you use String.substringWithRange? (or, how do Ranges work in Swift?)
[英]Swift 3: How to do string ranges?
昨晚我不得不將我的Swift 2.3代碼轉換為Swift 3.0,轉換后我的代碼很亂。 在Swift 2.3中,我有以下代碼:
let maxChar = 40;
let val = "some long string";
var startRange = val.startIndex;
var endRange = val.startIndex.advancedBy(maxChar, limit: val.endIndex);
let index = val.rangeOfString(" ", options: NSStringCompareOptions.BackwardsSearch , range: startRange...endRange , locale: nil)?.startIndex;
Xcode將我的代碼轉換為不起作用的代碼:
let maxChar = 40;
let val = "some long string";
var startRange = val.startIndex;
var endRange = val.characters.index(val.startIndex, offsetBy: maxChar, limitedBy: val.endIndex);
let index = val.range(of: " ", options: NSString.CompareOptions.backwards , range: startRange...endRange , locale: nil)?.lowerBound
錯誤在val.rage
的參數range
,說沒有'...'候選產生預期的上下文結果類型'Range?' 。
我嘗試使用Range(startRange...endRange)
作為文檔中的建議,但我得到錯誤說: connot使用類型的爭論列表(ClosedRange)調用類型ClosedRange <_>的initiliazer 。 好像我錯過了一些基本的東西。
任何幫助表示贊賞。 謝謝!
簡單回答:你缺少的基本要素是現在一個封閉的范圍與范圍不同。 因此,將startRange...endRange
更改為startRange..<endRange
。
更詳細地說,這是代碼的縮寫版本(沒有maxChar
部分):
let val = "some long string";
var startRange = val.startIndex;
var endRange = val.endIndex;
let index = val.range(
of: " ", options: .backwards, range: startRange..<endRange)?.lowerBound
// 9
現在,您可以將其用作恢復實際所需功能的基礎。
但是,如果您只想拆分字符串,那么重新發明輪子有點愚蠢:
let arr = "hey ho ha".characters.split(separator:" ").map{String($0)}
arr // ["hey", "ho", "ha"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.