2017-08-10 96 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?