I have just updated my project to Xcode 8 and Swift 3.
My problem is that my app is very very slow to compile a specific class, the following:
var dict: Dictionary<String, AnyObject> {
return [
"book_key": book_key as AnyObject,
"book_title": book_title as AnyObject,
"book_author": book_author as AnyObject,
"book_price": book_price as AnyObject,
"book_publisher" : book_publisher as AnyObject,
"page_count": page_count as AnyObject,
"book_description": book_description as AnyObject,
"book_urlImage" : book_urlImage as AnyObject,
"book_urlImage2": book_urlImage2 as AnyObject,
"user_key": user_key as AnyObject,
"user_name": user_name as AnyObject,
"user_tag_login" : user_tag_login as AnyObject,
"onGoingNegotiations" : onGoingNegotiations as AnyObject,
"other_user_key": other_user_key as AnyObject,
"other_tag_login": other_tag_login as AnyObject,
"book_condition": book_condition as AnyObject,
"timestamp": timestamp! as AnyObject
]
}
How can I resolve my problem? Thanks for the help.
The method is so slowly and so I have found the solution.
The timestamp NSNumber will be cast as String and so the method works perfectly again.
var dict: Dictionary<String, String> {
return [
"book_key": book_key,
"book_title": book_title,
"book_author": book_author,
"book_price": book_price,
"book_publisher" : book_publisher,
"page_count": page_count,
"book_description": book_description,
"book_urlImage" : book_urlImage,
"book_urlImage2": book_urlImage2,
"user_key": user_key,
"user_name": user_name,
"user_tag_login" : user_tag_login,
"onGoingNegotiations" : onGoingNegotiations,
"other_user_key": other_user_key,
"other_tag_login": other_tag_login,
"book_condition": book_condition,
"timestamp": timestamp
]
}
Thanks all for the help
Swift 3 like this:
if it is of several types
var dict: [String: Any] = [
"book_key": true,
"book_title": "Yannick",
"book_author": "Test",
"book_price": 123
]
Or if you return lot of String like this
var dict: [String: String] = [
"book_key": "true",
"book_author": "Yannick",
"book_price": "123",
"book_publisher": "Yannick",
"page_count": "123"
]
Related
I have a POST API in which I send multiple parameters, one of those parameters has to be an array of dictionaries.
let arr = [
[
"id" : "1",
"price" : "10"
],
[
"id" : "2",
"price" : "20"
]
]
let params : Parameters = [
"param1" : "anyvalue1",
"param2" : "anyvalue2",
"param3" : arr,
]
When I use these parameters in Alamofire Request and hit the API, print(res.result.value) always returns unknown. Can anyone help me with this. Following is the way of requesting the API
Alamofire.request(url, method:.post, parameters: params).responseJSON{(res) in
print(res.result.value) //always shows 'unknown' as output
}
Try to make params a Dic of [String :Any ] like that :
let params : [String:Any] = [
"param1" : "anyvalue1",
"param2" : "anyvalue2",
"param3" : arr,
]
I 'm having an array of dictionary like so...
[
{
"id" : "3",
"sellingPrice" : "520",
"quantity" : "15"
},
{
"id" : "5",
"sellingPrice" : "499",
"quantity" : "-1"
},
{
"id" : "8",
"sellingPrice" : "500",
"quantity" : "79"
}
]
Now I want to add to the dictionary another key called remaining_balance with a value of 420,499 & 500 respectively. How can I achieve this..? Hope somebody can help...
It seems like you want to add a value to your dictionary that is an array:
var arrDict = Array<Dictionary<String,Any>>() //Your array
arrDict.append(["id":"3","sellingPrice":"520","quantity":"13"])
arrDict.append(["id":"5","sellingPrice":"43","quantity":"32"])
arrDict.append(["id":"8","sellingPrice":"43","quantity":"33"])
let arrValue = ["420","499","500"] //Your remaining value in array
print("Before ",arrDict)
for (index,dict) in arrDict.enumerated() {
var dictCopy = dict //assign to var variable
dictCopy["remaining_balance"] = arrValue[index]
arrDict[index] = dictCopy //Replace at index with new dictionary
}
print("After ",arrDict)
EDIT
If you are able keep an index of an array it would be possible,
Assuming that you have the index of an array
var dictCopy = arrDict[index]
dictCopy["remaining_balance"] = "666" //Your calculated value
arrDict[index] = dictCopy //Replace at index with new dictionary
var newKV = [["remaining_balance": "420"],["remaining_balance": "490"],["remaining_balance": "500"]]
let array = [["id":"3", "sellingPrice":"520", "quantity":"15"], ["id":"5", "sellingPrice":"520", "quantity":"15"], ["id":"8", "sellingPrice":"520", "quantity":"15"]]
let newArray = array.enumerated().map { (index : Int, value: [String: String]) -> [String: String] in
var dic = value
dic.merge(newKV[index]) { (_, new) -> String in
new
}
return dic
}
You could achieve it by mapping your array:
var myArray = [["id": "3", "sellingPrice": "520", "quantity" : "15"], ["id": "5", "sellingPrice": "499", "quantity" : "-1"], ["id": "8", "sellingPrice": "500", "quantity" : "79"]]
print(myArray)
/*
[["id": "3", "sellingPrice": "520", "quantity": "15"],
["id": "5", "sellingPrice": "499", "quantity": "-1"],
["id": "8", "sellingPrice": "500", "quantity": "79"]]
*/
print("___________________")
var remainingBalanceDesriedValue = 420
myArray = myArray.map { (dict: [String: String]) -> [String: String] in
var copyDict = dict
copyDict["remaining_balance"] = "\(remainingBalanceDesriedValue)"
remainingBalanceDesriedValue = (remainingBalanceDesriedValue == 420) ? 499 : (remainingBalanceDesriedValue == 499) ? 500 : 420
return copyDict
}
print(myArray)
/*
[["sellingPrice": "520", "quantity": "15", "id": "3", "remaining_balance": "420"],
["sellingPrice": "499", "quantity": "-1", "id": "5", "remaining_balance": "499"],
["sellingPrice": "500", "quantity": "79", "id": "8", "remaining_balance": "500"]]
*/
Let's assume you have an array of dictionaries like so:
var arrayOfDictionaries = [
[
"id": 3,
"sellingPrice": 520,
"quantity": 15
]
]
It is important that arrayOfDictionaries is not a let constant, otherwise it is considered immutable and you can not call append on it.
Now you init a new dictionary like:
let newDictionary = [
"id": 10,
"remaining_balance": 420,
"quantity": 15
]
Now add the newDictionary like
arrayOfDictionaries.append(newDictionary)
If the order is important
If the order is important there are a couple of ways to go about that.
When calling append the new value (in this case the new dictionary) will always be inserted at the bottom of the array.
If for some reason you can not call append in the correct order you could use insert, which inserts your dictionary at a specific position.
Yet another way is to append the values wildly and after you are done, call sort on the array.
Improvement Tips
Notice that for the values I did not use strings, as you only have numbers like "id" : 30.
Also, if you want the second key to be called remaining_balance you should call the first key selling_price instead of sellingPrice. Because of conistency.
Alternative approach
As far as I have understood you are trying to implement some software that is responsibly for selling some products.
I think you are tackling this problem from a completely wrong side.
I think you should read about database relationships. Selling products actually is a very common problem.
Maybe this will help you. I would offer a possible solution myself, but I think this misses the point of your question.
If you decide to use the database approach, you won't necessarily have to use a database. You can take the approach and implement it using simple structs/classes/arrays.
I noticed this question lacks an extension answer, yes.. I'm gonna be that guy, so here it is. This could be made more generic by supporting other types of dictionaries, feel free to pitch in ;)
Inspiration from #eason's answer.
var newKV = [["remaining_balance": "420"],["remaining_balance": "490"],["remaining_balance": "500"]]
var array = [["id":"3", "sellingPrice":"520", "quantity":"15"], ["id":"5", "sellingPrice":"520", "quantity":"15"], ["id":"8", "sellingPrice":"520", "quantity":"15"]]
extension Array where Element == [String: String] {
enum UniquingKeysStrategy {
case old
case new
}
mutating func merge(with target: Array<Element>, uniquingKeysWith: UniquingKeysStrategy = .new) {
self = self.merged(with: target)
}
func merged(with target: Array<Element>, uniquingKeysWith strategy: UniquingKeysStrategy = .new) -> Array<Element> {
let base = self.count > target.count ? self : target
let data = self.count > target.count ? target : self
return data.enumerated().reduce(into: base, {
result, data in
result[data.offset]
.merge(data.element, uniquingKeysWith: {
old, new in
if strategy == .new { return new }
return old
})
})
}
}
let mergedArrays = newKV.merged(with: array, uniquingKeysWith: .old)
array.merge(with: newKV)
Happy Coding :)
I'm trying to convert a JSON string to an array. The JSON string is:
[
{
"field_value" : "28 Aug 2017",
"field_data_type_combo_value" : "",
"field_data_type_category_id" : "1",
"form_id" : "19",
"field_id" : "133",
"message_unique_id" : "7941501245582800298",
"field_data_type_combo_id" : "0",
"field_data_type_id" : "1"
},
{
"field_value" : "",
"field_data_type_combo_value" : "",
"field_data_type_category_id" : "9",
"form_id" : "19",
"field_id" : "134",
"message_unique_id" : "7941501245582714588",
"field_data_type_combo_id" : "0",
"field_data_type_id" : "26"
},
{
"field_value" : "hk",
"field_data_type_combo_value" : "",
"field_data_type_category_id" : "6",
"form_id" : "19",
"field_id" : "135",
"message_unique_id" : "7941501245582699681",
"field_data_type_combo_id" : "0",
"field_data_type_id" : "17"
}
]
and my conversion code is
if let data = text.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String : AnyObject]
} catch {
print(error.localizedDescription)
}
}
The conversion result is always nil. I also checked that JSON string in Online JSON Viewer and the string is correct. Please help me guys.
You explicitely write in your call:
as? [String: AnyObject]
In other words, you ask Swift to take whatever JSON returned, check that it is a dictionary with String keys, and either return that dictionary or nil. Since your data is an array and not a dictionary, it returns nil. Exactly what you asked for, but not what you wanted.
What you are expecting is an array of dictionaries, not a dictionary. You should also use Any instead of AnyObject. So convert it using
as? [[String: Any]]
The outer [] means it is an array, the inner [String: Any] means the items in the array must be dictionaries with String keys and Any values.
And why are you using .mutableContainers? If you have a good reason that you can explain then use it. If you don't and just copied the code from somewhere then remove it.
That json isn't a dictionary on the top level but an array. You can see that from the [ ... ], it would be a dictionary if it was { ... }. Fix your code using the corresponding cast:
return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [AnyObject]
I have a swift3 file which is a model.Xcode8 fails to compile this file and waits forever at compilation.If i exclude this file from my Project Target the project builds fine.It also builds fine with Xcode 7.There is no syntax issue with the file.Below is the code inside the file.
import UIKit
class KYCCompleteDetailRequestModel : NSObject {
func createRequestDictionaryForAddKYC(_ completeDetails:KYCCompleteDetailModel) -> [String : AnyObject]?
{
var parameter:[String : AnyObject]! = [String : AnyObject]()
let section1Details = self.createDictionaryForSection1(completeDetails.identityDetailModel!)
let section2Details = self.createDictionaryForSection2(completeDetails.addressDetailModel)
let section3Details = self.createDictionaryForSection3(completeDetails.otherDetailModel)
let section4Details = self.createDictionaryForSection4(completeDetails.bankDetailModel)
let section5Details = self.createDictionaryForSection5(completeDetails.section5Model)
let section6Details = self.createDictionaryForSection6(completeDetails.section6Model)
parameter["device_type"] = "I" as AnyObject?
parameter["section1"] = section1Details as AnyObject?
parameter["section2"] = section2Details as AnyObject?
parameter["section3"] = section3Details as AnyObject?
parameter["section4"] = section4Details as AnyObject?
parameter["section5"] = section5Details as AnyObject?
parameter["section6"] = section6Details as AnyObject?
return parameter
}
//** Create dictionary for section 1
func createDictionaryForSection1(_ section1 :FSKYCIdentityDetailsModel) -> Dictionary<String,AnyObject>{
var parameter =
[
"client_pan_number" : section1.user_pan_number! ,
"client_title" : section1.user_title! ,
"client_fname" : section1.user_firstname! ,
"client_mname" : section1.user_middlename! ,
"client_lname" : section1.user_lastname! ,
"client_phone" : section1.user_phone! ,
"client_mobile" : section1.user_mobile! ,
"client_email" : section1.user_email! ,
"client_ucc" : section1.user_ucc! ,
"client_email2" : section1.user_alternative_email!,
"resiadd1" : section1.user_resident_addr_street1!,
"resiadd2" : section1.user_resident_addr_street2!,
"resiadd3" : section1.user_resident_addr_street3!,
"rescity" : section1.user_resident_city!,
"respin" : section1.user_resident_pincode!,
"resstate" : section1.user_resident_state!,
"rescountry" : section1.user_resident_country!,
"father_fname" : section1.user_father_firstname!,
"father_mname" : section1.user_father_middlename!,
"father_lname" : section1.user_father_lastname!,
"adharno" : section1.user_adhaar_number!,
"dob" : section1.user_dob!,
"status" : section1.user_status!,
"gender" : section1.user_gender!,
"nationality" : section1.user_nationality!,
"maritalstatus" : section1.user_marital_status!,
"userphoto_status" : section1.user_photo_checkbox!,
"userphoto" : section1.user_photo!,
"pancardphoto_status": section1.user_pancard_photo_checkbox!,
"pancard_photo" : section1.user_pancard_photo!
]
return parameter as Dictionary<String, AnyObject>
}
//** Create dictionary for section 2
func createDictionaryForSection2(_ section2 :FSKYCAddressDetailsModel?) -> Dictionary<String,AnyObject>?{
if section2 == nil{
return nil
}
let parameter = [
"peradd1" : section2!.user_permanent_addr_street1! as AnyObject,
"peradd2" : section2!.user_permanent_addr_street2! as AnyObject,
"peradd3" : section2!.user_permanent_addr_street3! as AnyObject,
"percity" : section2!.user_permanent_city! as AnyObject,
"perpin" : section2!.user_permanent_pincode! as AnyObject,
"perstate" : section2!.user_permanent_state! as AnyObject,
"percountry" : section2!.user_permanent_country! as AnyObject,
"addr_phone" : section2!.user_addr_details_phone! as AnyObject,
"addr_mobile" : section2!.user_addr_details_mobile! as AnyObject,
"addr_fax" : section2!.user_addr_details_fax!,
"addr_email" : section2!.user_addr_details_email!,
"addr_proof" : section2!.user_addr_proof!,
"perment_proof_status": section2!.user_addr_proof_file_checkbox!,
"perment_proof" : section2!.user_addr_proof_file!
]
return parameter as Dictionary<String,AnyObject>
}
//** Create dictionary for section 3
func createDictionaryForSection3(_ section3 :FSKYCOtherDetailsModel?) -> Dictionary<String,AnyObject>?{
if section3 == nil{
return nil
}
let parameter: [String : AnyObject] =
[
"income_range" :section3!.user_income_range_per_annum! as AnyObject,
"worth_date" :section3!.user_net_worth_ondate! as AnyObject,
"worth_amount" :section3!.user_net_worth_ondate_rs! as AnyObject,
"Occupation" :section3!.user_occupation! as AnyObject,
"pep" :section3!.user_political_person! as AnyObject,
"information" :section3!.user_other_info! as AnyObject
]
return parameter
}
//** Create dictionary for section 4
func createDictionaryForSection4(_ section4 :FSKYCBankDetailsModel?) -> Dictionary<String,AnyObject>?{
if section4 == nil{
return nil
}
let parameter =
[
"bankname" :section4!.user_bank_name! as AnyObject,
"bank_accno" :section4!.user_bank_acc_number! as AnyObject,
"bank_account_type" :section4!.user_bank_acc_type! as AnyObject,
"micr" :section4!.user_micr_number! as AnyObject,
"ifsc" :section4!.user_ifsc_code! as AnyObject,
"chequeno" :section4!.user_cancelled_cheque_leaf_num! as AnyObject,
"chequeimage_status" :section4!.user_cancelled_cheque_leaf_file_checkbox! as AnyObject,
"cancel_chequeimage" :section4!.user_cancelled_cheque_leaf_file! as AnyObject,
"huf_checkbox" :section4!.partnershipfirm_checkbox! as AnyObject,
"huf_name" :section4!.partnershipfirm_username!,
"huf_pan" :section4!.partnershipfirm_pan_number!,
"accnt_type" :section4!.account_type!,
"nri_foreign" :section4!.nri_checkbox!,
"appref_number" :section4!.rib_apr_refer_number!,
"appref_date" :section4!.rib_app_refer_date!,
"nominee_reg" :section4!.reg_nominee_checkbox!,
"nom_name" :section4!.nominee_name!,
"nom_dob" :section4!.nominee_dob!,
"nom_age" :section4!.nominee_age!,
"nom_address" :section4!.nominee_address!,
"nominee_minor" :section4!.reg_minor_nominee_checkbox!,
"minor_dob" :section4!.minor_nominee_dob!,
"minor_name" :section4!.minor_nominee_name!,
"guardian_name" :section4!.guardian_name!,
"guardian_rel" :section4!.guardian_relation!,
"guardian_city" :section4!.guardian_city!,
"guardian_pincode" :section4!.guardian_pincode!,
"guardian_state" :section4!.guardian_state!,
"guardian_country" :section4!.guardian_country!,
"guardian_teloff" :section4!.guardian_office_number!,
"guardian_telres" :section4!.guardian_resi_number!,
"guardian_fax" :section4!.guardian_fax!,
"guardian_mobile" :section4!.guardian_mobile!,
"guardian_email" :section4!.guardian_email!
]
return parameter as Dictionary<String, AnyObject>
}
//** Create dictionary for section 5
func createDictionaryForSection5(_ section5 :FSKYCSection5Model?) -> Dictionary<String,AnyObject>?{
var section5 = section5
if section5 == nil{
let segmentDetails = FSKYCSection5Model()
section5 = segmentDetails
}
let parameter: [String : AnyObject] =
[
"istabneeded": section5!.istabNeeded! as AnyObject,
"isdemateacc": section5!.isOpenDematAccountChecked! as AnyObject,
"iscommodityacc": section5!.isOpenCommodityAccountChecked! as AnyObject,
"bankstatemnt_status" :section5!.bankstatemnt_checkbox! as AnyObject,
"bankstatemnt" :section5!.bankstatemnt! as AnyObject,
"pay_slip_status" :section5!.payslip_checkbox! as AnyObject,
"pay_slip" :section5!.pay_slip! as AnyObject
]
return parameter
}
//** Create dictionary for section 6
func createDictionaryForSection6(_ section6 :FSKYCSection6Model?) -> Dictionary<String,AnyObject>?{
if section6 == nil{
return nil
}
let parameter: [String : AnyObject] =
[
"terms&condition" : section6!.agree_chk! as AnyObject,
"payment_mode" : section6!.payment_mode! as AnyObject
]
return parameter
}
}
You can try the below options:-
Option 1#
Open your Project Folder.
Find ProjectName.xcodeproj file.
Right-Click Copy and Paste to Safe Place.
Right-Click Show Package Contents.
Find project.xcworkspace file and delete that file.
Reopen Your Project and clean and Rebuild.
Option 2#
Open File / Preferences in Xcode
Click on Locations on the far right of the pop up window
Click on the little arrow icon next to "/Users/Mac/Library/Developer/Xcode/DerivedData"....it takes you to an Xcode folder that contains a DerivedData folder (that contains all of the derived data from your previous projects.)
DELETE the DerivedData folder
Option 3#
Killing the processes named 'swift' and then checking the error in xcode will give you the part of the code giving you trouble. There are some bugs in swift that needs to be circumvented.
Option 4#
If creating a dictionary like this
var dic1 = [
"isDestination" : self.isDestination ?? false,
"price" : self.price ?? ""
]
where self.price is of type Int and giving its fallback value as an empty string which screwed up the XCode compilation.
Option 5#
Instead of using dictionary like this:
var parameter =
[
"client_pan_number" : section1.user_pan_number! ,
"client_title" : section1.user_title! ,
"client_fname" : section1.user_firstname! ,
"client_mname" : section1.user_middlename! ,
"client_lname" : section1.user_lastname! ,
"client_phone" : section1.user_phone! ,
"client_mobile" : section1.user_mobile! ,
"client_email" : section1.user_email! ,
"client_ucc" : section1.user_ucc! ,
"client_email2" : section1.user_alternative_email!,
"resiadd1" : section1.user_resident_addr_street1!,
"resiadd2" : section1.user_resident_addr_street2!,
"resiadd3" : section1.user_resident_addr_street3!,
"rescity" : section1.user_resident_city!,
"respin" : section1.user_resident_pincode!,
"resstate" : section1.user_resident_state!,
"rescountry" : section1.user_resident_country!,
"father_fname" : section1.user_father_firstname!,
"father_mname" : section1.user_father_middlename!,
"father_lname" : section1.user_father_lastname!,
"adharno" : section1.user_adhaar_number!,
"dob" : section1.user_dob!,
"status" : section1.user_status!,
"gender" : section1.user_gender!,
"nationality" : section1.user_nationality!,
"maritalstatus" : section1.user_marital_status!,
"userphoto_status" : section1.user_photo_checkbox!,
"userphoto" : section1.user_photo!,
"pancardphoto_status": section1.user_pancard_photo_checkbox!,
"pancard_photo" : section1.user_pancard_photo!
]
Use it like this:-
var parameter = ["client_pan_number" : section1.user_pan_number!]
parameter["client_title"] = section1.user_title!
parameter["client_fname"] = section1.user_firstname!
so on for other key-value pairs in your parameter dictionary. This happened because of Xcode not able index long list dictionary literals.
I'm trying to add multiple objects to NSDictionary, like
var myDict: NSDictionary = [["fname": "abc", "lname": "def"], ["fname": "ghi", "lname": "jkl"], ...]
Is it even possible to do this? If not, please suggest a better way. I actually need to convert this NSDictionary to JSON string and send that to the server, so I need multiple objects in NSDictionary.
You can definitely make a dictionary of dictionaries. However, you need a different syntax for that:
var myDictOfDict:NSDictionary = [
"a" : ["fname": "abc", "lname": "def"]
, "b" : ["fname": "ghi", "lname": "jkl"]
, ... : ...
]
What you have looks like an array of dictionaries, though:
var myArrayOfDict: NSArray = [
["fname": "abc", "lname": "def"]
, ["fname": "ghi", "lname": "jkl"]
, ...
]
To get JSON that looks like this
{"Data": [{"User": myDict1}, {"User": myDict1},...]}
you need to add the above array to a dictionary, like this:
var myDict:NSDictionary = ["Data" : myArrayOfDict]
SWIFT 3.0
List item
Frist of all you can create NSArray and Then you can Set Array in NSMutableDictionary using setvalue(forKey:) default method.
var arrFname : NSArray!
arrFname = ["abc","xyz","mno"]
var arrLname : NSArray!
arrFname = ["tuv","xuv","swift"]
var dicSet : NSMutableDictionary!
dicSet.setObject(arrFname, forKey : "Fname")
dicSet.setObject(arrLname, forKey : "Lname")
print(dicSet)
var tempDict = NSMutableDictionary()
tempDict.setValue("sam", forKey : "one")
print(tempDict["one"] ?? "1")