2016-10-07 17 views
7

に(記述)エラーのinitに変更されました:initはこのコードはスウィフト2で正常に動作スウィフト3

guard let userData = responseData["UserProfile"] as? [String : AnyObject] else { return } 

var userProfileFieldsDict = [String: String]() 
if let profileUsername = userData["Username"] as? NSString { 
    userProfileFieldsDict["username"] = String(profileUsername) 
} 
if let profileReputationpoints = userData["ReputationPoints"] as? NSNumber { 
    userProfileFieldsDict["reputation"] = String(profileReputationpoints) 
} 

しかし、Swift 3にそれはinitがあり

を言っuserProfileFieldsDict["reputation"]上のエラーをスローしますinitという名前に変更されました。(

私の質問は、その行で、なぜuserProfileFieldsDict["username"]割り当て行ではなく、どのようにそれを修正するために行くd?私はNSNumberStringにキャストしようとしていると仮定していますが、その理由を本当に理解できません。

+0

'NSNumber'は数字(' Float'、 'Double'、' Int'、でも 'Bool')のすべての種類を格納することができます - あなたは、文字列表現が見えるように期待して何をすべきか? – Hamish

答えて

10

NSNumberは非常に一般的なクラスです。 boolからlongまで、さらにはcharまでの任意の値にすることができます。コンパイラは実際には正確なデータ型がわからないため、正しいStringコンストラクタを呼び出すことができません。

userProfileFieldsDict["reputation"] = String(describing: profileReputationpoints) 

以下のように

代わりにここではそれについてinfo以上だString(describing:)コンストラクタを使用します。

3

Objective-Cタイプの使用を中止する必要があります。これはいつも悪い習慣で、今ではニワトリが家に帰ってきました。 NSStringとNSNumberにキャストしないでください。 Stringにキャストし、実際の数値型に変換します。例:

if let profileUsername = userData["Username"] as? String { 
    userProfileFieldsDict["username"] = profileUsername 
} 
if let profileReputationpoints = userData["ReputationPoints"] as? Int { // or whatever 
    userProfileFieldsDict["reputation"] = String(profileReputationpoints) 
} 
関連する問題