Bir JSON dosyam var, tablo görünümünde nesnelerin listesini ayrıştırmak ve kullanmak istiyorum. JSON dosyasını hızlı bir şekilde ayrıştırmak için kodu paylaşabilir mi?
Bir JSON dosyam var, tablo görünümünde nesnelerin listesini ayrıştırmak ve kullanmak istiyorum. JSON dosyasını hızlı bir şekilde ayrıştırmak için kodu paylaşabilir mi?
Yanıtlar:
Daha basit olamazdı:
import Foundation
let jsonData: Data = /* get your json data */
let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary
Bununla birlikte, Swift 4'te sunulan Kodlanabilir API'leri kullanmanızı şiddetle tavsiye ederim .
let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
NSData(contentsOfFile: path). Developer.apple.com/library/ios/documentation/Cocoa/Reference/… bakın :
API İsteğini Yapmak
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
Yanıt için hazırlanıyor
Aşağıdaki gibi bir dizi bildirin
var data: NSMutableData = NSMutableData()
Yanıtı almak
1.
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
// Received a new request, clear out the data object
self.data = NSMutableData()
}
2.
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
// Append the received chunk of data to our data object
self.data.appendData(data)
}
3.
func connectionDidFinishLoading(connection: NSURLConnection!) {
// Request complete, self.data should now hold the resulting info
// Convert the retrieved data in to an object through JSON deserialization
var err: NSError
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
if jsonResult.count>0 && jsonResult["results"].count>0 {
var results: NSArray = jsonResult["results"] as NSArray
self.tableData = results
self.appsTableView.reloadData()
}
}
Bir NSURLConnectionyanıt aldığında, didReceiveResponseyöntemin bizim adımıza çağrılmasını bekleyebiliriz . Bu noktada verilerimizi şöyle diyerek sıfırlıyoruz:self.data = NSMutableData() , yeni bir boş veri nesnesi oluşturarak verilerimizi sıfırlıyoruz.
Bir bağlantı yapıldıktan sonra, yöntemde veri almaya başlayacağız didReceiveData . Burada iletilen veri argümanı, tüm sulu bilgilerimizin geldiği yerdir. Gelen her parçayı tutmamız gerekiyor, bu yüzden onu daha önce temizlediğimiz self.data nesnesine ekliyoruz.
Son olarak, bağlantı tamamlandığında ve tüm veriler alındığında, connectionDidFinishLoadingçağrılır ve uygulamamızdaki verileri kullanmaya hazırız. Yaşasın!
Buradaki connectionDidFinishLoadingyöntem , URL'nizdeki sonuçların serisini kaldırarak NSJSONSerializationham verilerimizi yararlı Dictionarynesnelere dönüştürmek için sınıfı kullanır .
JSON adında bir sınıf yazdım, bu da Swift'de JSON işlemeyi ES5'teki JSON nesnesi kadar kolaylaştırıyor.
Swift nesnenizi şu şekilde JSON'a çevirin:
let obj:[String:AnyObject] = [
"array": [JSON.null, false, 0, "",[],[:]],
"object":[
"null": JSON.null,
"bool": true,
"int": 42,
"double": 3.141592653589793,
"string": "a α\t弾\n𪚲",
"array": [],
"object": [:]
],
"url":"http://blog.livedoor.com/dankogai/"
]
let json = JSON(obj)
json.toString()
... veya ip ...
let json = JSON.parse("{\"array\":[...}")
... veya URL.
let json = JSON.fromURL("http://api.dan.co.jp/jsonenv")
Tree Traversal
Öğeleri alt simge aracılığıyla geçirin:
json["object"]["null"].asNull // NSNull()
// ...
json["object"]["string"].asString // "a α\t弾\n𪚲"
json["array"][0].asNull // NSNull()
json["array"][1].asBool // false
// ...
SwiftyJSON gibi , abone girişi yoksa endişelenmezsiniz.
if let b = json["noexistent"][1234567890]["entry"].asBool {
// ....
} else {
let e = json["noexistent"][1234567890]["entry"].asError
println(e)
}
Aboneliklerden sıkıldıysanız, planınızı şu şekilde ekleyin:
//// schema by subclassing
class MyJSON : JSON {
init(_ obj:AnyObject){ super.init(obj) }
init(_ json:JSON) { super.init(json) }
var null :NSNull? { return self["null"].asNull }
var bool :Bool? { return self["bool"].asBool }
var int :Int? { return self["int"].asInt }
var double:Double? { return self["double"].asDouble }
var string:String? { return self["string"].asString }
}
Ve sen git:
let myjson = MyJSON(obj)
myjson.object.null
myjson.object.bool
myjson.object.int
myjson.object.double
myjson.object.string
// ...
Umarım beğenirsin.
Yeni xCode 7.3+ ile etki alanınızı istisna listesine eklemeniz önemlidir (NSAppTransportSecurity'i info.plist dosyama nasıl ekleyebilirim? ), Talimatlar için bu gönderiye bakın, aksi takdirde bir taşıma yetkisi hatası alırsınız.
İşte Swift 2.0'da JSON ve NSData arasındaki dönüşümleri yapmak için bir kod.
// Convert from NSData to json object
func nsdataToJSON(data: NSData) -> AnyObject? {
do {
return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
} catch let myJSONError {
print(myJSONError)
}
return nil
}
// Convert from JSON to nsdata
func jsonToNSData(json: AnyObject) -> NSData?{
do {
return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
} catch let myJSONError {
print(myJSONError)
}
return nil;
}
Swift ise 4+ şiddetle kullanılması önerilir CodableyerineJSONSerialization .
Bu Codable, iki protokolü içerir: Decodableve Encodable. Bu Decodableprotokol,Data bu protokole uyan özel yapı / sınıfa JSON biçiminde çözmenize .
Örneğin, bu kadar basit Data(iki nesneden oluşan bir dizi) sahip olduğumuz durumu hayal edin.
let data = Data("""
[
{"name":"Steve","age":56},
{"name":"iPhone","age":11}
]
""".utf8)
sonra takip edin structve protokolü uygulayınDecodable
struct Person: Decodable {
let name: String
let age: Int
}
Artık deşifre edebilir Datasizin diziye Personkullanarak JSONDecoderilk parametreyi uygun türüdür Decodablegereken bu tip ve Datadeşifre edilmesi
do {
let people = try JSONDecoder().decode([Person].self, from: data)
} catch { print(error) }
... kod çözmenin tryanahtar kelime ile işaretlenmesi gerektiğini unutmayın, çünkü örneğin isimlendirmede bazı hatalar yapabilirsiniz ve modelinizin kodu doğru çözülemeyebilir ... bu yüzden do-try-catch bloğunun içine koymalısınız
Json'da anahtarın özellik adından farklı olduğu durumlar:
Anahtar içinde snake_case kullanılarak adlandırılır ise, yıllardan dekoder ayarlayabilirsiniz keyDecodingStrategyiçin convertFromSnakeCaseanahtarı değiştirir property_nameCamelCase içinpropertyName
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let people = try decoder.decode([Person].self, from: data)
Benzersiz bir ada ihtiyacınız varsa , anahtar adını bildirdiğiniz struct / class içinde kodlama anahtarlarını kullanabilirsiniz .
let data = Data("""
{ "userName":"Codable", "age": 1 }
""".utf8)
struct Person: Decodable {
let name: String
let age: Int
enum CodingKeys: String, CodingKey {
case name = "userName"
case age
}
}
Ayrıca json yanıtının bir nesne yapısına eşlenmesi için uzmanlaşmış küçük bir kitaplık yazdım. Dahili olarak David Owens'ın json-swift kütüphanesini kullanıyorum. Belki başkası için yararlıdır.
https://github.com/prine/ROJSONParser
Örnek Employees.json
{
"employees": [
{
"firstName": "John",
"lastName": "Doe",
"age": 26
},
{
"firstName": "Anna",
"lastName": "Smith",
"age": 30
},
{
"firstName": "Peter",
"lastName": "Jones",
"age": 45
}]
}
Bir sonraki adım olarak, veri modelinizi (EmplyoeeContainer ve Employee) oluşturmanız gerekir.
Çalışan.swift
class Employee : ROJSONObject {
required init() {
super.init();
}
required init(jsonData:AnyObject) {
super.init(jsonData: jsonData)
}
var firstname:String {
return Value<String>.get(self, key: "firstName")
}
var lastname:String {
return Value<String>.get(self, key: "lastName")
}
var age:Int {
return Value<Int>.get(self, key: "age")
}
}
EmployeeContainer.swift
class EmployeeContainer : ROJSONObject {
required init() {
super.init();
}
required init(jsonData:AnyObject) {
super.init(jsonData: jsonData)
}
lazy var employees:[Employee] = {
return Value<[Employee]>.getArray(self, key: "employees") as [Employee]
}()
}
Ardından, JSON yanıtından nesneleri gerçekten eşlemek için, yalnızca verileri yapıcıdaki param olarak EmployeeContainer sınıfına iletmeniz gerekir. Veri modelinizi otomatik olarak oluşturur.
var baseWebservice:BaseWebservice = BaseWebservice();
var urlToJSON = "http://prine.ch/employees.json"
var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in
for employee in employeeContainer.employees {
println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
}
}
baseWebservice.get(urlToJSON, callback:callbackJSON)
Konsol çıktısı şu şekilde görünür:
Firstname: John Lastname: Doe age: 26
Firstname: Anna Lastname: Smith age: 30
Firstname: Peter Lastname: Jones age: 45
Son derece basit ve okunması kolay!
"mrap"gelen nicknamesbu JSON yanıtından bir String olarak{
"other": {
"nicknames": ["mrap", "Mikee"]
}
Json verilerinizi NSDataolduğu gibi alır, ön işlemeye gerek yoktur.
let parser = JSONParser(jsonData)
if let handle = parser.getString("other.nicknames[0]") {
// that's it!
}
Feragatname: Bunu ben yaptım ve umarım herkese yardımcı olur. Onu geliştirmekten çekinmeyin!
JSON'u Swift'de ayrıştırmak, kod üretimi için mükemmel bir iştir. Bunu yapmak için http://www.guideluxe.com/JsonToSwift adresinde bir araç oluşturdum .
Bir sınıf adıyla örnek bir JSON nesnesi sağlarsınız ve araç, örnek JSON tarafından ima edilen yapıyı temsil etmek için ilgili bir Swift sınıfının yanı sıra gerekli tüm yardımcı Swift sınıflarını da oluşturur. Ayrıca, NSJSONSerialization.JSONObjectWithData yöntemini kullanan biri de dahil olmak üzere Swift nesnelerini doldurmak için kullanılan sınıf yöntemleri de dahildir. NSArray ve NSDictionary nesnelerinden gerekli eşlemeler sağlanır.
Oluşturulan koddan, yalnızca araca sağlanan örnekle eşleşen JSON içeren bir NSData nesnesi sağlamanız gerekir.
Foundation dışında hiçbir bağımlılık yoktur.
Çalışmam http://json2csharp.com/ ' dan ilham aldı. , .NET projeleri için çok kullanışlı olan .
JSON dosyasından bir NSData nesnesinin nasıl oluşturulacağı aşağıda açıklanmıştır.
let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!
Not: Eğer bunu arıyorsanız, nasıl kurulacağını bilmeme ihtimaliniz de yüksek swifty. Buradaki talimatları izleyin .
sudo gem install cocoapods
cd ~/Path/To/Folder/Containing/ShowTracker
Ardından şu komutu girin:
pod init
Bu, Podfileprojeniz için bir varsayılan oluşturacaktır . PodfileEğer proje dayanır bağımlılıkları tanımlamak yerdir.
Açmak için bu komutu yazın Podfilekullanarak Xcodedüzenleme için:
open -a Xcode Podfile
Ekle Swiftypodfile içine
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'SwiftyJSON', '~> X.X.X'
end
var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric")
if mURL == nil{
println("You are stupid")
return
}
var request = NSURLRequest(URL: mURL!)
NSURLConnection.sendAsynchronousRequest(
request,
queue: NSOperationQueue.mainQueue(),
completionHandler:{ (
response: NSURLResponse!,
data: NSData!,
error: NSError!) -> Void in
if data != nil {
var mJSON = JSON(data: data!)
if let current_conditions = mJSON["weather"][0]["description"].string {
println("Current conditions: " + current_conditions)
} else {
println("MORON!")
}
if let current_temperature = mJSON["main"]["temp"].double {
println("Temperature: "+ String(format:"%.f", current_temperature) + "°C"
} else {
println("MORON!")
}
}
})
Json parsig'in iki yöntemini kullanarak toplama görünümünde verileri gösteren tüm görüntü denetleyicisi
@IBOutlet weak var imagecollectionview: UICollectionView!
lazy var data = NSMutableData()
var dictdata : NSMutableDictionary = NSMutableDictionary()
override func viewDidLoad() {
super.viewDidLoad()
startConnection()
startNewConnection()
// Do any additional setup after loading the view, typically from a nib.
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dictdata.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell
cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String
let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! )
LazyImage.showForImageView(cell.image, url:"URL
return cell
}
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let kWhateverHeightYouWant = 100
return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant))
}
func startNewConnection()
{
let url: URL = URL(string: "YOUR URL" as String)!
let session = URLSession.shared
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "GET" //set the get or post according to your request
// request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let task = session.dataTask(with: request as URLRequest) {
( data, response, error) in
guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
print("error")
return
}
let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String
}
task.resume()
}
func startConnection(){
let urlPath: String = "your URL"
let url: NSURL = NSURL(string: urlPath)!
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
self.data.appendData(data)
}
func buttonAction(sender: UIButton!){
startConnection()
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
do {
let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0))
guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else {
print("Not a Dictionary")
// put in function
return
}
print("JSONDictionary! \(JSONDictionary)")
dictdata.setObject(JSONDictionary, forKey: "Data")
imagecollectionview.reloadData()
}
catch let JSONError as NSError {
print("\(JSONError)")
} }
ObjectMapper çerçevesini kullanma
if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") {
do {
let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe)
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
self.levels = Mapper<Level>().mapArray(JSONArray: (json as! [[String : Any]]))!
print(levels.count)
} catch let error as NSError {
print(error.localizedDescription)
}
} else {
print("Invalid filename/path.")
}
Uygun setini hazırlamadan önce: Ayrıştırılacak eşlenebilir nesneler
import UIKit
import ObjectMapper
class Level: Mappable {
var levelName = ""
var levelItems = [LevelItem]()
required init?(map: Map) {
}
// Mappable
func mapping(map: Map) {
levelName <- map["levelName"]
levelItems <- map["levelItems"]
}
import UIKit
import ObjectMapper
class LevelItem: Mappable {
var frontBackSide = BPPFrontBack.Undefined
var fullImageName = ""
var fullImageSelectedName = ""
var bodyParts = [BodyPart]()
required init?(map: Map) {
}
// Mappable
func mapping(map: Map) {
frontBackSide <- map["frontBackSide"]
fullImageName <- map["fullImageName"]
fullImageSelectedName <- map["fullImageSelectedName"]
bodyParts <- map["bodyParts"]
}}
Hızlı 3
let parsedResult: [String: AnyObject]
do {
parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject]
} catch {
// Display an error or return or whatever
}
veri - Veri türü (Yapı) (yani bazı sunucu yanıtları tarafından döndürülür)
Bu ayrıştırıcı, JSON'u Swift türlerine dönüştürmek için jenerikleri kullanır ve bu da yazmanız gereken kodu azaltır.
https://github.com/evgenyneu/JsonSwiftson
struct Person {
let name: String?
let age: Int?
}
let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")
let person: Person? = Person(
name: mapper["name"].map(),
age: mapper["age"].map()
)
Aşağıda bir Swift Playground örneği verilmiştir:
import UIKit
let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}"
let data = jsonString.data(using: .utf8)
var jsonObject: Any
do {
jsonObject = try JSONSerialization.jsonObject(with: data!) as Any
if let obj = jsonObject as? NSDictionary {
print(obj["name"])
}
} catch {
print("error")
}
Swift 4
Proje Oluşturun
Bir Düğme ve UITableview ile StoryBoard Tasarlayın
TableViewCell VC oluştur
Düğme Eyleminde Aşağıdaki Kodları Girin
Bir API'deki Veri Dizisini Getirmek İçin Bu Kodu Hatırlayın
import UIKit
class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet var tableView: UITableView!
var displayDatasssss = [displyDataClass]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return displayDatasssss.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
cell.label1.text = displayDatasssss[indexPath.row].email
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func gettt(_ sender: Any) {
let url = "http://jsonplaceholder.typicode.com/users"
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request){(data, response,error)in
if (error != nil){
print("Error")
}
else{
do{
// Array of Data
let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
for eachData in fetchData {
let eachdataitem = eachData as! [String : Any]
let name = eachdataitem["name"]as! String
let username = eachdataitem["username"]as! String
let email = eachdataitem["email"]as! String
self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))
}
self.tableView.reloadData()
}
catch{
print("Error 2")
}
}
}
task.resume()
}
}
class displyDataClass {
var name : String
var username : String
var email : String
init(name : String,username : String,email :String) {
self.name = name
self.username = username
self.email = email
}
}
Bu, Sözlük veri Alımı içindir
import UIKit
class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet var tableView: UITableView!
var displayDatasssss = [displyDataClass]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return displayDatasssss.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
cell.label1.text = displayDatasssss[indexPath.row].email
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func gettt(_ sender: Any) {
let url = "http://jsonplaceholder.typicode.com/users/1"
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request){(data, response,error)in
if (error != nil){
print("Error")
}
else{
do{
//Dictionary data Fetching
let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! [String: AnyObject]
let name = fetchData["name"]as! String
let username = fetchData["username"]as! String
let email = fetchData["email"]as! String
self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email))
self.tableView.reloadData()
}
catch{
print("Error 2")
}
}
}
task.resume()
}
}
class displyDataClass {
var name : String
var username : String
var email : String
init(name : String,username : String,email :String) {
self.name = name
self.username = username
self.email = email
}
}
Faydalanmak JSONDecoder().decode
Swift 4 ile JSON ayrıştırma videosunu izleyin
struct Post: Codable {
let userId: Int
let id: Int
let title: String
let body: String
}
URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/posts")!) { (data, response, error) in
guard let response = response as? HTTPURLResponse else {
print("HTTPURLResponse error")
return
}
guard 200 ... 299 ~= response.statusCode else {
print("Status Code error \(response.statusCode)")
return
}
guard let data = data else {
print("No Data")
return
}
let posts = try! JSONDecoder().decode([Post].self, from: data)
print(posts)
}.resume()
Swift 2 iOS 9
let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!)
do{
let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
print(".........\(MyData)")
}
catch let error as NSError{
// error.description
print(error.description)
}