2017-08-10 116 views
1
var modifiedString: String {  

    var outString = String() 
     for thisChar in self.characters { 
      if (thisChar == " "){ 
       outString.appendingFormat("%%02X",thisChar) // This line is asking me unwrap as CVarArg 
       outString.appendingFormat("%%02X",thisChar as! CVarArg) // This line crashes 
      } 
     } 
    } 
} 

我想使用outString.appendingFormat("%%02X",thisChar) 但此行是逼着我解開爲CVarArg,但是當我這樣做導致崩潰。這裏有什麼問題字符串,字符格式崩潰

+0

你真的想做些什麼?即使你修正了這個錯誤,你的代碼也會充滿奇怪的東西。 - 缺少回報。 - appendingFormat不修改'outString',所以'for循環結束時它的值是空的。 - 格式'「%% 02X」'不會消耗參數並生成'「%02X」'。 - 白色字幕以外的所有字符均被忽略。 – OOPer

+0

您是否嘗試將ASCII值轉換爲十六進制數字?也許你應該使用'.utf8'而不是'.characters'? – Sulthan

+0

另外,你只編碼空格字符,因爲'if thisChar ==「」'? – Sulthan

回答

1

我假設這是放在String擴展名中。

發生錯誤是因爲Character不符合CVarArg。不需要直接將字符轉換爲CVarArg,您需要將其轉換爲符合CVarArg的類型。在這裏,最好的選擇是String

outString.appendingFormat("%%02X", "\(thisChar)") 

你也缺少一個return語句。

但是,即使你這樣做了,並且你的代碼編譯了,你寫的屬性仍然沒有多大意義。我不認爲它按照你的意圖工作,但沒有更多的信息,我不能確定。

0

使用此代碼 -

var modifiedString: String { 
     var outString = String() 
     for thisChar in self.characters { 
      if (thisChar == " "){ 
       // outString = outString.appendingFormat("%%02X",thisChar.description) 
       outString = outString.appendingFormat("%%02X", "\(thisChar)") 

      } 
      else 
      { 
       outString = outString.appending("\(thisChar)") 
      } 
     } 
     return outString 
    } 

希望這有助於!

0

這是不夠清楚自己想要做什麼,但我想你想要做這樣的事情:

extension String { 
    var modifiedString: String { 
     var outString = "" 
     for thisChar in self.characters { 
      if thisChar == " " { 
       let charCode = String(thisChar).unicodeScalars.first!.value 
       outString += "%" + String(format: "%02X", charCode) 
       //### Or if you prefer... (Do not miss, you need 3 '%'s in the format string.) 
       //outString = outString.appendingFormat("%%%02X", charCode) 
      } else { 
       outString.append(thisChar) 
      } 
     } 
     return outString 
    } 
} 

print("what you really want to do?".modifiedString) 
//->what%20you%20really%20want%20to%20do? 

for thisChar in self.characters循環的thisChar類型變得Character,它不是易於從Swift中的Character獲得字符代碼。

可能有一些更好的方法,但let charCode = String(thisChar).unicodeScalars.first!.value按預期工作,當thisChar只包含一個UnicodeScalar


你應該更好地瞭解雨燕的方法命名爲addingPercentEncoding

let result = "what you really want to do?".addingPercentEncoding(withAllowedCharacters: CharacterSet.whitespaces.inverted)! 
print(result) 
//->what%20you%20really%20want%20to%20do?