Error trying to decode custom NSCoding object in Swift [duplicate]










0















This question already has an answer here:



  • Swift 3 saving and retrieving custom object from userDefaults

    3 answers



This is my code:



 required convenience init?(coder aDecoder: NSCoder) 

// The name is required. If we cannot decode a name string, the initializer should fail.
guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else
os_log("Unable to decode the name for a Savings object.", log: OSLog.default, type: .debug)
return nil


// Because photo is an optional property of Savings, just use conditional cast.
let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage

let savingsAmount = aDecoder.decodeObject(forKey: PropertyKey.savingsAmount)

let amountSavedPerWeek = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

let amountSavedSoFar = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

// Must call designated initializer.
self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)



func encode(with aCoder: NSCoder)
aCoder.encode(name, forKey: PropertyKey.name)
aCoder.encode(photo, forKey: PropertyKey.photo)
aCoder.encode(savingsAmount, forKey: PropertyKey.savingsAmount)
aCoder.encode(amountPerWeek,forKey: PropertyKey.amountSavedPerWeek)
aCoder.encode(amountSavedSoFar, forKey: PropertyKey.amountSavedSoFar)



On this line:



self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)


properties
var name: String
var photo: UIImage?
var savingsAmount: String
var amountPerWeek: String
var amountSavedSoFar: Int



I get the error Cannot convert value of type 'Int.Type' to expected argument type 'Int'. I can't seem to figure the fix to this, the only time the error came up was when I added the type "Int". Thanks for the help.










share|improve this question















marked as duplicate by Ken White, Leo Dabus swift
Users with the  swift badge can single-handedly close swift questions as duplicates and reopen them as needed.

StackExchange.ready(function()
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();

);
);
);
Nov 10 at 2:52


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.










  • 2




    You need to pass an Int value, not the keyword Int.
    – rmaddy
    Nov 10 at 1:25











  • let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
    – Leo Dabus
    Nov 10 at 1:56










  • self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
    – Leo Dabus
    Nov 10 at 1:56






  • 1




    @LeoDabus got it to work with that! Thanks!
    – Evan
    Nov 10 at 2:04















0















This question already has an answer here:



  • Swift 3 saving and retrieving custom object from userDefaults

    3 answers



This is my code:



 required convenience init?(coder aDecoder: NSCoder) 

// The name is required. If we cannot decode a name string, the initializer should fail.
guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else
os_log("Unable to decode the name for a Savings object.", log: OSLog.default, type: .debug)
return nil


// Because photo is an optional property of Savings, just use conditional cast.
let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage

let savingsAmount = aDecoder.decodeObject(forKey: PropertyKey.savingsAmount)

let amountSavedPerWeek = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

let amountSavedSoFar = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

// Must call designated initializer.
self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)



func encode(with aCoder: NSCoder)
aCoder.encode(name, forKey: PropertyKey.name)
aCoder.encode(photo, forKey: PropertyKey.photo)
aCoder.encode(savingsAmount, forKey: PropertyKey.savingsAmount)
aCoder.encode(amountPerWeek,forKey: PropertyKey.amountSavedPerWeek)
aCoder.encode(amountSavedSoFar, forKey: PropertyKey.amountSavedSoFar)



On this line:



self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)


properties
var name: String
var photo: UIImage?
var savingsAmount: String
var amountPerWeek: String
var amountSavedSoFar: Int



I get the error Cannot convert value of type 'Int.Type' to expected argument type 'Int'. I can't seem to figure the fix to this, the only time the error came up was when I added the type "Int". Thanks for the help.










share|improve this question















marked as duplicate by Ken White, Leo Dabus swift
Users with the  swift badge can single-handedly close swift questions as duplicates and reopen them as needed.

StackExchange.ready(function()
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();

);
);
);
Nov 10 at 2:52


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.










  • 2




    You need to pass an Int value, not the keyword Int.
    – rmaddy
    Nov 10 at 1:25











  • let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
    – Leo Dabus
    Nov 10 at 1:56










  • self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
    – Leo Dabus
    Nov 10 at 1:56






  • 1




    @LeoDabus got it to work with that! Thanks!
    – Evan
    Nov 10 at 2:04













0












0








0








This question already has an answer here:



  • Swift 3 saving and retrieving custom object from userDefaults

    3 answers



This is my code:



 required convenience init?(coder aDecoder: NSCoder) 

// The name is required. If we cannot decode a name string, the initializer should fail.
guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else
os_log("Unable to decode the name for a Savings object.", log: OSLog.default, type: .debug)
return nil


// Because photo is an optional property of Savings, just use conditional cast.
let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage

let savingsAmount = aDecoder.decodeObject(forKey: PropertyKey.savingsAmount)

let amountSavedPerWeek = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

let amountSavedSoFar = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

// Must call designated initializer.
self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)



func encode(with aCoder: NSCoder)
aCoder.encode(name, forKey: PropertyKey.name)
aCoder.encode(photo, forKey: PropertyKey.photo)
aCoder.encode(savingsAmount, forKey: PropertyKey.savingsAmount)
aCoder.encode(amountPerWeek,forKey: PropertyKey.amountSavedPerWeek)
aCoder.encode(amountSavedSoFar, forKey: PropertyKey.amountSavedSoFar)



On this line:



self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)


properties
var name: String
var photo: UIImage?
var savingsAmount: String
var amountPerWeek: String
var amountSavedSoFar: Int



I get the error Cannot convert value of type 'Int.Type' to expected argument type 'Int'. I can't seem to figure the fix to this, the only time the error came up was when I added the type "Int". Thanks for the help.










share|improve this question
















This question already has an answer here:



  • Swift 3 saving and retrieving custom object from userDefaults

    3 answers



This is my code:



 required convenience init?(coder aDecoder: NSCoder) 

// The name is required. If we cannot decode a name string, the initializer should fail.
guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else
os_log("Unable to decode the name for a Savings object.", log: OSLog.default, type: .debug)
return nil


// Because photo is an optional property of Savings, just use conditional cast.
let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage

let savingsAmount = aDecoder.decodeObject(forKey: PropertyKey.savingsAmount)

let amountSavedPerWeek = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

let amountSavedSoFar = aDecoder.decodeObject(forKey: PropertyKey.amountSavedPerWeek)

// Must call designated initializer.
self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)



func encode(with aCoder: NSCoder)
aCoder.encode(name, forKey: PropertyKey.name)
aCoder.encode(photo, forKey: PropertyKey.photo)
aCoder.encode(savingsAmount, forKey: PropertyKey.savingsAmount)
aCoder.encode(amountPerWeek,forKey: PropertyKey.amountSavedPerWeek)
aCoder.encode(amountSavedSoFar, forKey: PropertyKey.amountSavedSoFar)



On this line:



self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: Int)


properties
var name: String
var photo: UIImage?
var savingsAmount: String
var amountPerWeek: String
var amountSavedSoFar: Int



I get the error Cannot convert value of type 'Int.Type' to expected argument type 'Int'. I can't seem to figure the fix to this, the only time the error came up was when I added the type "Int". Thanks for the help.





This question already has an answer here:



  • Swift 3 saving and retrieving custom object from userDefaults

    3 answers







swift






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 10 at 2:57









Leo Dabus

129k30263339




129k30263339










asked Nov 10 at 1:07









Evan

83




83




marked as duplicate by Ken White, Leo Dabus swift
Users with the  swift badge can single-handedly close swift questions as duplicates and reopen them as needed.

StackExchange.ready(function()
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();

);
);
);
Nov 10 at 2:52


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.






marked as duplicate by Ken White, Leo Dabus swift
Users with the  swift badge can single-handedly close swift questions as duplicates and reopen them as needed.

StackExchange.ready(function()
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();

);
);
);
Nov 10 at 2:52


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.









  • 2




    You need to pass an Int value, not the keyword Int.
    – rmaddy
    Nov 10 at 1:25











  • let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
    – Leo Dabus
    Nov 10 at 1:56










  • self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
    – Leo Dabus
    Nov 10 at 1:56






  • 1




    @LeoDabus got it to work with that! Thanks!
    – Evan
    Nov 10 at 2:04












  • 2




    You need to pass an Int value, not the keyword Int.
    – rmaddy
    Nov 10 at 1:25











  • let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
    – Leo Dabus
    Nov 10 at 1:56










  • self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
    – Leo Dabus
    Nov 10 at 1:56






  • 1




    @LeoDabus got it to work with that! Thanks!
    – Evan
    Nov 10 at 2:04







2




2




You need to pass an Int value, not the keyword Int.
– rmaddy
Nov 10 at 1:25





You need to pass an Int value, not the keyword Int.
– rmaddy
Nov 10 at 1:25













let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
– Leo Dabus
Nov 10 at 1:56




let amountSavedSoFar = aDecoder.decodeInteger(forKey: PropertyKey.amountSavedPerWeek)
– Leo Dabus
Nov 10 at 1:56












self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
– Leo Dabus
Nov 10 at 1:56




self.init(name: name, photo: photo, savingsAmount: savingsAmount as! String, amountPerWeek: amountSavedPerWeek as! String, amountSavedSoFar: amountSavedSoFar)
– Leo Dabus
Nov 10 at 1:56




1




1




@LeoDabus got it to work with that! Thanks!
– Evan
Nov 10 at 2:04




@LeoDabus got it to work with that! Thanks!
– Evan
Nov 10 at 2:04












1 Answer
1






active

oldest

votes


















0














You have this (I added line breaks to make it easier to read):



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: Int)


but I think you meant to type this:



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: amountSavedSoFar as! Int)


Basically, you forgot to pass in the local variable amountSavedSoFar and instead just typed Int, so the compiler thinks you're trying to pass in the type Int itself as the parameter, which is why you're getting that error.



Also, one unrelated thing, I find it interesting that if name is not able to be decoded, then you return nil, but then if savingsAmount, amountPerWeek, or amountSavedSoFar cannot be decoded then you've opted to crash the app by using the "crash here" operator, as!. You may also want to return nil if any of those can't be decoded either.






share|improve this answer




















  • Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
    – Evan
    Nov 10 at 1:57











  • @Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
    – TylerTheCompiler
    Nov 10 at 4:34

















1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














You have this (I added line breaks to make it easier to read):



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: Int)


but I think you meant to type this:



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: amountSavedSoFar as! Int)


Basically, you forgot to pass in the local variable amountSavedSoFar and instead just typed Int, so the compiler thinks you're trying to pass in the type Int itself as the parameter, which is why you're getting that error.



Also, one unrelated thing, I find it interesting that if name is not able to be decoded, then you return nil, but then if savingsAmount, amountPerWeek, or amountSavedSoFar cannot be decoded then you've opted to crash the app by using the "crash here" operator, as!. You may also want to return nil if any of those can't be decoded either.






share|improve this answer




















  • Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
    – Evan
    Nov 10 at 1:57











  • @Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
    – TylerTheCompiler
    Nov 10 at 4:34















0














You have this (I added line breaks to make it easier to read):



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: Int)


but I think you meant to type this:



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: amountSavedSoFar as! Int)


Basically, you forgot to pass in the local variable amountSavedSoFar and instead just typed Int, so the compiler thinks you're trying to pass in the type Int itself as the parameter, which is why you're getting that error.



Also, one unrelated thing, I find it interesting that if name is not able to be decoded, then you return nil, but then if savingsAmount, amountPerWeek, or amountSavedSoFar cannot be decoded then you've opted to crash the app by using the "crash here" operator, as!. You may also want to return nil if any of those can't be decoded either.






share|improve this answer




















  • Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
    – Evan
    Nov 10 at 1:57











  • @Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
    – TylerTheCompiler
    Nov 10 at 4:34













0












0








0






You have this (I added line breaks to make it easier to read):



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: Int)


but I think you meant to type this:



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: amountSavedSoFar as! Int)


Basically, you forgot to pass in the local variable amountSavedSoFar and instead just typed Int, so the compiler thinks you're trying to pass in the type Int itself as the parameter, which is why you're getting that error.



Also, one unrelated thing, I find it interesting that if name is not able to be decoded, then you return nil, but then if savingsAmount, amountPerWeek, or amountSavedSoFar cannot be decoded then you've opted to crash the app by using the "crash here" operator, as!. You may also want to return nil if any of those can't be decoded either.






share|improve this answer












You have this (I added line breaks to make it easier to read):



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: Int)


but I think you meant to type this:



self.init(name: name,
photo: photo,
savingsAmount: savingsAmount as! String,
amountPerWeek: amountSavedPerWeek as! String,
amountSavedSoFar: amountSavedSoFar as! Int)


Basically, you forgot to pass in the local variable amountSavedSoFar and instead just typed Int, so the compiler thinks you're trying to pass in the type Int itself as the parameter, which is why you're getting that error.



Also, one unrelated thing, I find it interesting that if name is not able to be decoded, then you return nil, but then if savingsAmount, amountPerWeek, or amountSavedSoFar cannot be decoded then you've opted to crash the app by using the "crash here" operator, as!. You may also want to return nil if any of those can't be decoded either.







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 10 at 1:27









TylerTheCompiler

4,54522130




4,54522130











  • Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
    – Evan
    Nov 10 at 1:57











  • @Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
    – TylerTheCompiler
    Nov 10 at 4:34
















  • Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
    – Evan
    Nov 10 at 1:57











  • @Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
    – TylerTheCompiler
    Nov 10 at 4:34















Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
– Evan
Nov 10 at 1:57





Ok... Umm I tried that, but when I do that it gives me more errors. 🙄: Expected expression in list of expressions Cannot invoke 'Savings.init' with an argument list of type '(name: String, photo: UIImage?, savingsAmount: String, amountPerWeek: String)'
– Evan
Nov 10 at 1:57













@Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
– TylerTheCompiler
Nov 10 at 4:34




@Evan Ah, I failed to notice that you needed to use decodeInteger instead of decodeObject. Glad you got it to work at least!
– TylerTheCompiler
Nov 10 at 4:34



Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)