GVKun编程网logo

iOS(Swift)学习笔记之SwiftyJSON的使用(ios swift 教程)

22

本篇文章给大家谈谈iOS(Swift)学习笔记之SwiftyJSON的使用,以及iosswift教程的知识点,同时本文还将给你拓展iOS15中Swift和SwiftUI的使用情况、ios–Swifty

本篇文章给大家谈谈iOS(Swift)学习笔记之SwiftyJSON的使用,以及ios swift 教程的知识点,同时本文还将给你拓展iOS 15 中 Swift 和 SwiftUI 的使用情况、ios – SwiftyJSON字典解析、ios – SwiftyJSON性能问题、ios – Swift:使用Alamofire和SwiftyJSON处理JSON等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

iOS(Swift)学习笔记之SwiftyJSON的使用(ios swift 教程)

iOS(Swift)学习笔记之SwiftyJSON的使用(ios swift 教程)

本文为原创文章,转载请标明出处

1. 通过CocoaPods安装SwiftyJSON

platform :ios, ''10.0''

target ''<Your Target Name>'' do

  use_frameworks!

  pod ''SwiftyJSON'', ''~> 4.0.0''

end

2. 初始化

import SwiftyJSON

let json = JSON(data: dataFromNetworking)
let json = JSON(jsonObject)
if let dataFromString = jsonString.data(using: .utf8, allowLossyConversion: false) {
    let json = JSON(data: dataFromString)
}

3. 下标访问

// 方式1
let name = json[1]["list"][2]["name"].string

//方式2
let name = json[1,"list",2,"name"].string

//方式3
let keys:[JSONSubscriptType] = [1,"list",2,"name"]
let name = json[keys].string
let arrayNames =  json["users"].arrayValue.map({$0["name"].stringValue})

4. 循环遍历

不管JSON是数组类型还是字典类型key的类型都为String

for (key,subJSON) in json {
    ...
}

5. 错误处理

枚举类型SwiftyJSONError包含unsupportedTypeindexOutOfBoundselementTooDeepwrongTypenotExistinvalidJSONerrorDomain

6. 可选值获取

通过.number.string.bool.int等方法获取到的是可选值。

if let id = json["user"]["name"].string {
    ...
} else {
    ...
    print(json["user"]["name"].error!)
}

7. 非可选值获取

通过.xxxValue方法获取到的是非可选值。

// 若不是String或为nil,返回“”
let name: String = json["name"].stringValue

8. 设置值

json["name"] = JSON("new-name")
json[0] = JSON(1)
json["name"].string =  "Jack"
json.arrayObject = [1,2,3,4]
json.dictionaryObject = ["name":"Jack", "age":25]

9. 原始数据

let rawObject: Any = json.object
let rawValue: Any = json.rawValue
do {
	let rawData = try json.rawData()
} catch {
	print("Error \(error)")
}
if let rawString = json.rawString() {
    ...
} else {
	print("json.rawString is nil")
}

10. 其他方法

exists

// 判断是否存在
if json["name"].exists()

merge

let original: JSON = [
    "first_name": "Theo",
    "age": 20,
    "skills": ["Coding", "Reading"],
    "address": [
        "street": "Software St",
        "zip": "210046",
    ]
]

let update: JSON = [
    "last_name": "Tsao",
    "age": 22,
    "skills": ["Writing"],
    "address": [
        "zip": "210012",
        "city": "Nanjing"
    ]
]

let updated = original.merge(with: update)

输出:

[
    "first_name": "Theo",
    "last_name": "Tsao",
    "age": 22,
    "skills": ["Coding", "Reading", "Writing"],
    "address": [
        "street": "Software St",
        "zip": "210012",
        "city": "Nanjing"
    ]
]

iOS 15 中 Swift 和 SwiftUI 的使用情况

iOS 15 中 Swift 和 SwiftUI 的使用情况

iOS 15 于 2021 年 9 月发布。但你知道 iOS 15 有多少个二进制文件吗?它使用了哪些编程语言来开发这些应用程序?有多少应用程序是用 Swift 编写的?Apple 是否为某些内置应用程序采用了 SwiftUI?

近日,开发者通过分析 iOS 15 的内置应用得出了结论(这里开发者分析的 iOS 指内核之上的一切东西,不包括 XNU 内核和底层固件)。

iOS 15 中的 Swift 和 SwiftUI

iOS 15 包含 114 个使用 SwiftUI 的二进制文件,几乎是 iOS 14 的 3 倍。同样,包含至少一行 Swift 代码的二进制文件的数量在 iOS 14 和 iOS 15 之间多了差不多两倍:

如图表所示,Apple 继续在其内置应用程序中逐步采用 Swift。今年也是采用 SwiftUI 的重要一年。一些广泛使用的应用程序现在似乎在 iOS 15 中使用 SwiftUI:

  • Books
  • Maps
  • Notes
  • Weather
  • Tips
  • Music
  • Podcasts
  • FaceTime? (InCallService)
  • AppSettings?

还有在 iOS 15 之前就已开始使用 SwiftUI 的 5 个应用:

  • Translate
  • Shortcuts
  • Phone
  • AirPods Connect Pop-up? (SharingViewService)
  • Lock Screen? (SleepLockScreen)

其他使用 SwiftUI 的二进制文件主要是小部件或新框架。下面是使用 SwiftUI 的 114 个二进制文件的完整列表:

/Applications/AppSettings.app/AppSettings
/Applications/AppStore.app/PlugIns/AppStoreWidgetsExtension.appex/AppStoreWidgetsExtension
/Applications/FamilyControlsAuthenticationUI.app/FamilyControlsAuthenticationUI
/Applications/FindMy.app/PlugIns/FindMyWidgetIntentsItems.appex/FindMyWidgetIntentsItems
/Applications/FindMy.app/PlugIns/FindMyWidgetIntentsPeople.appex/FindMyWidgetIntentsPeople
/Applications/FindMy.app/PlugIns/FindMyWidgetItems.appex/FindMyWidgetItems
/Applications/FindMy.app/PlugIns/FindMyWidgetPeople.appex/FindMyWidgetPeople
/Applications/FTMInternal-4.app/FTMInternal-4
/Applications/GameCenterWidgets.app/PlugIns/GCWidgets.appex/GCWidgets
/Applications/InCallService.app/InCallService
/Applications/PeopleViewService.app/PlugIns/PeopleWidget_iOSExtension.appex/PeopleWidget_iOSExtension
/Applications/SleepWidgetContainer.app/PlugIns/SleepWidgetExtension.appex/SleepWidgetExtension
/private/var/staged_system_apps/Books.app/Books
/private/var/staged_system_apps/Maps.app/Maps
/private/var/staged_system_apps/MobileMail.app/PlugIns/MailWidgetExtension.appex/MailWidgetExtension
/private/var/staged_system_apps/MobileNotes.app/MobileNotes
/private/var/staged_system_apps/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex/com.apple.mobilenotes.SharingExtension
/private/var/staged_system_apps/Music.app/Frameworks/MusicApplication.framework/MusicApplication
/private/var/staged_system_apps/Podcasts.app/Frameworks/PodcastsStoreUI.framework/PodcastsStoreUI
/private/var/staged_system_apps/Shortcuts.app/PlugIns/QuickLookExtension.appex/QuickLookExtension
/private/var/staged_system_apps/Tips.app/Tips
/private/var/staged_system_apps/Weather.app/Weather
/System/Library/Assistant/UIPlugins/SiriFindMyUIPlugin.siriUIBundle/SiriFindMyUIPlugin
/System/Library/Frameworks/_CoreLocationUI_SwiftUI.framework/_CoreLocationUI_SwiftUI
/System/Library/Frameworks/_MusicKit_SwiftUI.framework/_MusicKit_SwiftUI
/System/Library/Frameworks/FamilyControls.framework/FamilyControls
/System/Library/Frameworks/FamilyControls.framework/PlugIns/ActivityPickerExtension.appex/ActivityPickerExtension
/System/Library/Health/FeedItemPlugins/Heart.healthplugin/Heart
/System/Library/Health/FeedItemPlugins/Highlights.healthplugin/Highlights
/System/Library/Health/FeedItemPlugins/MenstrualCyclesAppPlugin.healthplugin/MenstrualCyclesAppPlugin
/System/Library/Health/FeedItemPlugins/SleepHealthAppPlugin.healthplugin/SleepHealthAppPlugin
/System/Library/Health/FeedItemPlugins/Summaries.healthplugin/Summaries
/System/Library/PreferenceBundles/BatteryUsageUI.bundle/BatteryUsageUI
/System/Library/PreferenceBundles/CoreRoutineSettings.bundle/CoreRoutineSettings
/System/Library/PreferenceBundles/FocusSettings.bundle/FocusSettings
/System/Library/PrivateFrameworks/AccessibilitySharedUISupport.framework/AccessibilitySharedUISupport
/System/Library/PrivateFrameworks/ActionKitUI.framework/ActionKitUI
/System/Library/PrivateFrameworks/CommandAndControlUI.framework/CommandAndControlUI
/System/Library/PrivateFrameworks/CoreChartSwift.framework/CoreChartSwift
/System/Library/PrivateFrameworks/CoreSuggestionsUI.framework/CoreSuggestionsUI
/System/Library/PrivateFrameworks/FocusSettingsUI.framework/FocusSettingsUI
/System/Library/PrivateFrameworks/FocusUI.framework/FocusUI
/System/Library/PrivateFrameworks/HealthExperienceUI.framework/HealthExperienceUI
/System/Library/PrivateFrameworks/HealthRecordsUI.framework/HealthRecordsUI
/System/Library/PrivateFrameworks/HealthVisualization.framework/HealthVisualization
/System/Library/PrivateFrameworks/HearingUI.framework/HearingUI
/System/Library/PrivateFrameworks/MediaFoundation.framework/MediaFoundation
/System/Library/PrivateFrameworks/MessagesSupport.framework/MessagesSupport
/System/Library/PrivateFrameworks/MLKit.framework/MLKit
/System/Library/PrivateFrameworks/MLKit.framework/PlugIns/com.apple.MLKit.MLModelPreview.appex/com.apple.MLKit.MLModelPreview
/System/Library/PrivateFrameworks/MLKit.framework/PlugIns/com.apple.MLKit.MLPackagePreview.appex/com.apple.MLKit.MLPackagePreview
/System/Library/PrivateFrameworks/NotesUI.framework/NotesUI
/System/Library/PrivateFrameworks/PaymentUI.framework/PaymentUI
/System/Library/PrivateFrameworks/PeopleUI.framework/PeopleUI
/System/Library/PrivateFrameworks/PreviewsInjection.framework/PreviewsInjection
/System/Library/PrivateFrameworks/PreviewsMessaging.framework/PreviewsMessaging
/System/Library/PrivateFrameworks/ScreenTimeUICore.framework/ScreenTimeUICore
/System/Library/PrivateFrameworks/SleepHealthUI.framework/SleepHealthUI
/System/Library/PrivateFrameworks/SleepWidgetUI.framework/SleepWidgetUI
/System/Library/PrivateFrameworks/SnippetUI.framework/SnippetUI
/System/Library/PrivateFrameworks/TipKit.framework/TipKit
/System/Library/PrivateFrameworks/TranslationUI.framework/TranslationUI
/System/Library/PrivateFrameworks/TranslationUIServices.framework/PlugIns/TranslationUIService.appex/TranslationUIService
/System/Library/PrivateFrameworks/VideosUI.framework/VideosUI
/System/Library/PrivateFrameworks/WeatherUI.framework/WeatherUI
/System/Library/PrivateFrameworks/WorkflowUI.framework/WorkflowUI
/System/Library/Snippets/UIPlugins/AudioUIPlugin.bundle/AudioUIPlugin
/System/Library/Snippets/UIPlugins/SiriVideoUIPlugin.bundle/SiriVideoUIPlugin
/System/Library/Snippets/UIPlugins/SystemPlugin.bundle/SystemPlugin
/usr/lib/swift/libswiftExtensionKit.dylib
/usr/libexec/proximitycontrold

二进制文件总数

iOS 15 由 4738 个二进制文件组成,高于 iOS 14 中的 4173 个,新增了 565 个新二进制文件。

编程语言的演变

通过分析从 iPhone OS 1.0 到 iOS 15 的所有 iOS 主要版本,可以看到 iOS 使用的编程语言的演变。请注意,单个二进制文件可以计算多次,因此下图中二进制文件的总和大于二进制文件的总数:

在 iOS 15 中的所有二进制文件中:

  • 89% 使用 Objective-C
  • 17% 使用 C++
  • 13% 使用 Swift
  • 8% 完全用 C 编写
  • 2% 使用 SwiftUI

由此可见:

  • Objective-C 仍然是 iOS 的核心
  • Apple 对 Swift 的使用比以往任何时候都更快。去年 Swift 的代码量比例超过了 C,今年则越来越接近 C++
  • SwiftUI 去年几乎没有引起人们的注意,但今年 Apple 似乎更广泛地采用了它,即使是在旗舰应用程序中
  • C++ 和 C 仍然扮演着重要的角色。这些语言通常由与音频、视频、电话、Web 和其他底层框架相关的二进制文件使用

下图是每种编程语言演变的另一种表示形式:

最后,这名开发者提供了原始数据,如果你也希望进行更深入的分析,可查看从 iPhone OS 1.0 到 iOS 15.0 的所有主要 iOS 版本生成的原始数据。

Version Device Raw Data
iOS 15.0 (19A346) iPhone 13 Pro iOS15.txt
iOS 14.0 (18A373) iPhone X iOS14.txt
iOS 13.1 (17A844) iPhone X iOS13.txt
iOS 12.0 (16A366) iPhone X iOS12.txt
iOS 11.1 (15B93) iPhone X iOS11.txt
iOS 10.1 (14B72) iPhone 5s iOS10.txt
iOS 9.0 (13A344) iPhone 5s iOS9.txt
iOS 8.0 (12A365) iPhone 5s iOS8.txt
iOS 7.0.1 (11A470a) iPhone 5s iOS7.txt
iOS 6.0 (10A403) iPhone 3GS iOS6.txt
iOS 5.0 (9A334) iPhone 3GS iOS5.txt
iOS 4.0 (8A293) iPhone 3GS iOS4.txt
iPhone OS 3.0 (7A341) iPhone 3GS iOS3.txt
iPhone OS 2.0 (5A347) iPhone 2G iOS2.txt
iPhone OS 1.0 (1A543a) iPhone 2G iOS1.txt

ios – SwiftyJSON字典解析

ios – SwiftyJSON字典解析

我试图使用 SwiftyJSON来解析服务器中的一些数据.

例如,假设从服务器返回的JSON是:

{     
 "data":{  
     "id":"92","name":"harry","username":"Hazza"
   },"error":false
}

我想获取用户名字符串,所以为此我使用以下方法获取数据对象:

let data = json["data"].dictionaryValue

然后为了获取我希望能够做的用户名字符串

let username = data["username"].stringValue

但是,这会返回一个错误,说'(String,JSON)没有名为’.stringValue’的成员.

这个看似简单的问题在哪里出错了?

谢谢.

解决方法

你应该做的是:

if let username = json["data"]["username"].string {
    println(username)
}

ios – SwiftyJSON性能问题

ios – SwiftyJSON性能问题

我正在使用我们的API从 SwiftyJson解析JSON并填充核心数据来严重执行性能问题.

数据是与Alamofire下载的,它很好地工作,但用SwiftyJson解析json是非常慢的.为了看看图书馆真的是这个问题,我重写了在解析数据的许多地方之一的json解析.在下面的代码中,我解析了约400个旅游景点之一的开放时间.

看到这些截图的差异,7,7秒到185毫秒:

快乐的方式:

let openDescription:String = json["openingHours"]["openingHoursGenericExceptions"].string!
    let monopen:[String]    = json["openingHours"]["Monday"]["From"].string!.componentsSeparatedByString(":")
    let monClose:[String]   = json["openingHours"]["Monday"]["To"].string!.componentsSeparatedByString(":")
    let tueOpen:[String]    = json["openingHours"]["Tuesday"]["From"].string!.componentsSeparatedByString(":")
    let tueClose:[String]   = json["openingHours"]["Tuesday"]["To"].string!.componentsSeparatedByString(":")
    let wedOpen:[String]    = json["openingHours"]["Wednesday"]["From"].string!.componentsSeparatedByString(":")
    let wedClose:[String]   = json["openingHours"]["Wednesday"]["To"].string!.componentsSeparatedByString(":")
    let thuOpen:[String]    = json["openingHours"]["Thursday"]["From"].string!.componentsSeparatedByString(":")
    let thuClose:[String]   = json["openingHours"]["Thursday"]["To"].string!.componentsSeparatedByString(":")
    let friOpen:[String]    = json["openingHours"]["Friday"]["From"].string!.componentsSeparatedByString(":")
    let friClose:[String]   = json["openingHours"]["Friday"]["To"].string!.componentsSeparatedByString(":")
    let satOpen:[String]    = json["openingHours"]["Saturday"]["From"].string!.componentsSeparatedByString(":")
    let satClose:[String]   = json["openingHours"]["Saturday"]["To"].string!.componentsSeparatedByString(":")
    let sunopen:[String]    = json["openingHours"]["Sunday"]["From"].string!.componentsSeparatedByString(":")
    let sunClose:[String]   = json["openingHours"]["Sunday"]["To"].string!.componentsSeparatedByString(":")

本土方式:

var monopen:[String] = []
    var monClose:[String] = []
    var tueOpen:[String] = []
    var tueClose:[String] = []
    var wedOpen:[String] = []
    var wedClose:[String] = []
    var thuOpen:[String] = []
    var thuClose:[String] = []
    var friOpen:[String] = []
    var friClose:[String] = []
    var satOpen:[String] = []
    var satClose:[String] = []
    var sunopen:[String] = []
    var sunClose:[String] = []
    var openDescription:String = ""

    if let attractionsArray = orgJson as? NSArray{
        if let attraction = attractionsArray[0] as? NSDictionary{
            if let openHours = attraction["openingHours"] as? NSDictionary{
                if let day = openHours["Monday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        monopen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        monClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Tuesday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        tueOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        tueClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Wednesday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        wedOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        wedClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Thursday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        thuOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        thuClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Friday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        friOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        friClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Saturday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        satOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        satClose = close.componentsSeparatedByString(":")
                    }
                }
                if let day = openHours["Sunday"] as? NSDictionary{
                    if let open = day["From"] as? String{
                        sunopen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"] as? String{
                        sunClose = close.componentsSeparatedByString(":")
                    }
                }
                if let desc = openHours["openingHoursGenericExceptions"] as? String{
                    openDescription = desc
                }
            }
        }
    }

这只是要解析的数据的一部分,因此该应用程序中的性能非常明显.

我猜问题是,我使用SwiftyJSON不正确或者这是预期的吗?

解决方法

首先,你的“本土方式”不等同于“Swifty方式”.

SwiftyJSON版本有45个下标访问,但本机只有23个下标访问.

要使“本土方式”相当,应该是这样的:

let openDescription = attraction["openingHours"]!["openingHoursGenericExceptions"] as String
let monopen  = (attraction["openingHours"]!["Monday"]!!["From"] as String).componentsSeparatedByString(":")
let monClose = (attraction["openingHours"]!["Monday"]!!["To"] as String).componentsSeparatedByString(":")
let tueOpen  = (attraction["openingHours"]!["Tuesday"]!!["From"] as String).componentsSeparatedByString(":")
let tueClose = (attraction["openingHours"]!["Tuesday"]!!["To"]! as String).componentsSeparatedByString(":")
// ...

或“快乐的方式”应该是:

let openHours = json[0]["openingHours"]
var day:JSON

day = openHours["Monday"]
if let open = day["From"].string {
    monopen = open.componentsSeparatedByString(":")
}
if let close = day["To"].string {
    monClose = close.componentsSeparatedByString(":")
}
day = openHours["Tuesday"]
if let open = day["From"].string {
    tueOpen = open.componentsSeparatedByString(":")
}
if let close = day["To"].string {
    tueClose = close.componentsSeparatedByString(":")
}
// ...

无论如何,是的,SwiftyJSON很慢.我们来衡量:

import Foundation
import XCTest

let orgJson:AnyObject = [
    [
        "openingHours": [
            "openingHoursGenericExceptions": "test","Monday":    ["From":"1:2:3","To":"1:2:3"],"Tuesday":   ["From":"1:2:3","Wednesday": ["From":"1:2:3","Thursday":  ["From":"1:2:3","Friday":    ["From":"1:2:3","Saturday":  ["From":"1:2:3","Sunday":    ["From":"1:2:3",]
    ]
]
let json = JSON(orgJson)

class JSONTestTests: XCTestCase {

    func testNativeSubscript() {
        measureBlock { () -> Void in

            for _ in 0 ..< 400 {
                autoreleasepool {
                    if let attraction = orgJson[0] as? NSDictionary {
                        let openDescription = attraction["openingHours"]!["openingHoursGenericExceptions"] as String
                        let monopen  = (attraction["openingHours"]!["Monday"]!!["From"] as String).componentsSeparatedByString(":")
                        let monClose = (attraction["openingHours"]!["Monday"]!!["To"] as String).componentsSeparatedByString(":")
                        let tueOpen  = (attraction["openingHours"]!["Tuesday"]!!["From"] as String).componentsSeparatedByString(":")
                        let tueClose = (attraction["openingHours"]!["Tuesday"]!!["To"] as String).componentsSeparatedByString(":")
                        let wedOpen  = (attraction["openingHours"]!["Wednesday"]!!["From"] as String).componentsSeparatedByString(":")
                        let wedClose = (attraction["openingHours"]!["Wednesday"]!!["To"] as String).componentsSeparatedByString(":")
                        let thuOpen  = (attraction["openingHours"]!["Thursday"]!!["From"] as String).componentsSeparatedByString(":")
                        let thuClose = (attraction["openingHours"]!["Thursday"]!!["To"] as String).componentsSeparatedByString(":")
                        let friOpen  = (attraction["openingHours"]!["Friday"]!!["From"] as String).componentsSeparatedByString(":")
                        let friClose = (attraction["openingHours"]!["Friday"]!!["To"] as String).componentsSeparatedByString(":")
                        let satOpen  = (attraction["openingHours"]!["Saturday"]!!["From"] as String).componentsSeparatedByString(":")
                        let satClose = (attraction["openingHours"]!["Saturday"]!!["To"] as String).componentsSeparatedByString(":")
                        let sunopen  = (attraction["openingHours"]!["Sunday"]!!["From"] as String).componentsSeparatedByString(":")
                        let sunClose = (attraction["openingHours"]!["Sunday"]!!["To"] as String).componentsSeparatedByString(":")
                        XCTAssertEqual(monopen,["1","2","3"],"")
                        XCTAssertEqual(openDescription,"test")
                    }
                }
            }
        }
    }

    func testJSONSubscript() {
        measureBlock { () -> Void in
            for _ in 0 ..< 400 {
                autoreleasepool {
                    let attraction = json[0]
                    let openDescription:String = attraction["openingHours"]["openingHoursGenericExceptions"].string!
                    let monopen:[String]    = attraction["openingHours"]["Monday"]["From"].string!.componentsSeparatedByString(":")
                    let monClose:[String]   = attraction["openingHours"]["Monday"]["To"].string!.componentsSeparatedByString(":")
                    let tueOpen:[String]    = attraction["openingHours"]["Tuesday"]["From"].string!.componentsSeparatedByString(":")
                    let tueClose:[String]   = attraction["openingHours"]["Tuesday"]["To"].string!.componentsSeparatedByString(":")
                    let wedOpen:[String]    = attraction["openingHours"]["Wednesday"]["From"].string!.componentsSeparatedByString(":")
                    let wedClose:[String]   = attraction["openingHours"]["Wednesday"]["To"].string!.componentsSeparatedByString(":")
                    let thuOpen:[String]    = attraction["openingHours"]["Thursday"]["From"].string!.componentsSeparatedByString(":")
                    let thuClose:[String]   = attraction["openingHours"]["Thursday"]["To"].string!.componentsSeparatedByString(":")
                    let friOpen:[String]    = attraction["openingHours"]["Friday"]["From"].string!.componentsSeparatedByString(":")
                    let friClose:[String]   = attraction["openingHours"]["Friday"]["To"].string!.componentsSeparatedByString(":")
                    let satOpen:[String]    = attraction["openingHours"]["Saturday"]["From"].string!.componentsSeparatedByString(":")
                    let satClose:[String]   = attraction["openingHours"]["Saturday"]["To"].string!.componentsSeparatedByString(":")
                    let sunopen:[String]    = attraction["openingHours"]["Sunday"]["From"].string!.componentsSeparatedByString(":")
                    let sunClose:[String]   = attraction["openingHours"]["Sunday"]["To"].string!.componentsSeparatedByString(":")
                    XCTAssertEqual(monopen,"")
                }
            }
        }
    }

    func testNativeBinding() {
        measureBlock { () -> Void in
            for _ in 0 ..< 400 {
                autoreleasepool {
                    var monopen:[String] = []
                    var monClose:[String] = []
                    var tueOpen:[String] = []
                    var tueClose:[String] = []
                    var wedOpen:[String] = []
                    var wedClose:[String] = []
                    var thuOpen:[String] = []
                    var thuClose:[String] = []
                    var friOpen:[String] = []
                    var friClose:[String] = []
                    var satOpen:[String] = []
                    var satClose:[String] = []
                    var sunopen:[String] = []
                    var sunClose:[String] = []
                    var openDescription:String = ""

                    if let attractionsArray = orgJson as? NSArray{
                        if let attraction = attractionsArray[0] as? NSDictionary{
                            if let openHours = attraction["openingHours"] as? NSDictionary{
                                if let day = openHours["Monday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        monopen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        monClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Tuesday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        tueOpen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        tueClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Wednesday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        wedOpen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        wedClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Thursday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        thuOpen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        thuClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Friday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        friOpen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        friClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Saturday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        satOpen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        satClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let day = openHours["Sunday"] as? NSDictionary{
                                    if let open = day["From"] as? String{
                                        sunopen = open.componentsSeparatedByString(":")
                                    }
                                    if let close = day["To"] as? String{
                                        sunClose = close.componentsSeparatedByString(":")
                                    }
                                }
                                if let desc = openHours["openingHoursGenericExceptions"] as? String{
                                    openDescription = desc
                                }
                            }
                        }
                    }
                    XCTAssertEqual(monopen,"")
                }
            }
        }
    }
    func testJSONBinding() {
        measureBlock { () -> Void in
            for _ in 0 ..< 400 {
                autoreleasepool {
                    var monopen:[String] = []
                    var monClose:[String] = []
                    var tueOpen:[String] = []
                    var tueClose:[String] = []
                    var wedOpen:[String] = []
                    var wedClose:[String] = []
                    var thuOpen:[String] = []
                    var thuClose:[String] = []
                    var friOpen:[String] = []
                    var friClose:[String] = []
                    var satOpen:[String] = []
                    var satClose:[String] = []
                    var sunopen:[String] = []
                    var sunClose:[String] = []
                    var openDescription:String = ""

                    let openHours = json[0]["openingHours"]
                    var day:JSON

                    day = openHours["Monday"]
                    if let open = day["From"].string {
                        monopen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        monClose
                            = close.componentsSeparatedByString(":")
                    }
                    day = openHours["Tuesday"]
                    if let open = day["From"].string {
                        tueOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        tueClose = close.componentsSeparatedByString(":")
                    }
                    day = openHours["WednesDay"]
                    if let open = day["From"].string {
                        wedOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        wedClose = close.componentsSeparatedByString(":")
                    }
                    day = openHours["Thursday"]
                    if let open = day["From"].string {
                        thuOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        thuClose = close.componentsSeparatedByString(":")
                    }
                    day = openHours["Friday"]
                    if let open = day["From"].string {
                        friOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        friClose = close.componentsSeparatedByString(":")
                    }
                    day = openHours["Saturday"]
                    if let open = day["From"].string {
                        satOpen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        satClose = close.componentsSeparatedByString(":")
                    }
                    day = openHours["Sunday"]
                    if let open = day["From"].string {
                        sunopen = open.componentsSeparatedByString(":")
                    }
                    if let close = day["To"].string {
                        sunClose = close.componentsSeparatedByString(":")
                    }
                    XCTAssertEqual(monopen,"")
                }
            }
        }
    }

}

输出:

<unkNown>:0: Test Case '-[JSONTestTests.JSONTestTests testJSONBinding]' measured [Time,seconds] average: 0.804,relative standard deviation: 5.592%,values: [0.835687,0.814827,0.819685,0.841900,0.764961,0.845202,0.691442,0.779255,0.818213,0.830698],performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime,baselineName: "",baselineAverage:,maxPercentRegression: 10.000%,maxPercentRelativeStandardDeviation: 10.000%,maxRegression: 0.100,maxStandardDeviation: 0.100
<unkNown>:0: Test Case '-[JSONTestTests.JSONTestTests testJSONSubscript]' measured [Time,seconds] average: 4.247,relative standard deviation: 3.496%,values: [4.019640,4.004123,4.146146,4.194535,4.487171,4.300971,4.310613,4.408405,4.318354,4.279362],maxStandardDeviation: 0.100
<unkNown>:0: Test Case '-[JSONTestTests.JSONTestTests testNativeBinding]' measured [Time,seconds] average: 0.223,relative standard deviation: 2.773%,values: [0.221099,0.227395,0.218860,0.225989,0.227128,0.222370,0.229956,0.214535,0.210818,0.229868],maxStandardDeviation: 0.100
<unkNown>:0: Test Case '-[JSONTestTests.JSONTestTests testNativeSubscript]' measured [Time,seconds] average: 0.362,relative standard deviation: 17.528%,values: [0.346285,0.316185,0.333650,0.339416,0.330243,0.354034,0.378730,0.269519,0.486904,0.467607],maxStandardDeviation: 0.100

>你的SwiftyJSON:4.247
>您的母语:0.223
>我的SwiftyJSON:0.804
>我的母语:0.362

顺便说一下,如果我是你,我会做一些像:

if let hours = orgJson[0]?["openingHours"] as? NSDictionary {
    let openDescription = hours["openingHoursGenericExceptions"] as? String ?? ""
    let monopen  = hours["Monday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let monClose = hours["Monday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let tueOpen  = hours["Tuesday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let tueClose = hours["Tuesday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let wedOpen  = hours["Wednesday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let wedClose = hours["Wednesday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let thuOpen  = hours["Thursday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let thuClose = hours["Thursday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let friOpen  = hours["Friday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let friClose = hours["Friday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let satOpen  = hours["Saturday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let satClose = hours["Saturday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let sunopen  = hours["Sunday"]?["From"]??.componentsSeparatedByString?(":") as? [String] ?? []
    let sunClose = hours["Sunday"]?["To"]??.componentsSeparatedByString?(":") as? [String] ?? []

    // ...
}

它是相当快,安全,不那么复杂.

为什么SwiftyJSON慢?

在下标访问中,SwiftyJSON确实:

>检查键是String
>下标再次与self [key:sub]
>检查底层对象是NSDictionary
>下标底层的NSDictionary与提供的键
>使用结果构造JSON对象
>返回

也许编译器优化了一些步骤,但是“比本机慢”有些不可避免的:)

ios – Swift:使用Alamofire和SwiftyJSON处理JSON

ios – Swift:使用Alamofire和SwiftyJSON处理JSON

这肯定会被问过几次,但我还没有找到正确的答案,尽管我一直很努力.

我使用Alamofire和SwiftyJSON,我的JSON数据看起来像这样:

{
  "528" : {
    "name" : "Name 1","id" : "528","product_id" : null,"visible" : "0","level" : "2"
  },"29" : {
    "name" : "Name 2","id" : "29","visible" : "1","level" : "1"
  },"173" : {
    "name" : "Name 3","id" : "173","143" : {
    "name" : "Name 4","id" : "143",

…使用此代码:

Alamofire.request(.GET,dataURL,parameters: nil,encoding: .JSON)

    .responseJSON { (request,response,jsonData,error) in

        let json = JSON(jsonData!) 

        println(json)

    }

…所以JSON一切都应该没问题

>我如何访问该数据?我的意思是我如何获得名称,ID,product_ids等
>我如何将该数据(名称)放入我的TableViewController?

解决方法

我在我的一个项目中使用了SwiftyJSON和Alamofire.这是我如何使用它.

>创建一个名为APIProtocol的协议.
>使用GET方法设置API类,该方法接受APIProtocol类型的委托.
>设置TableViewController以实现APIProtocol.
>从TableViewController调用API.get()

// Step 1
protocol APIProtocol {
  func didReceiveResult(results: JSON)
}

// Step 2
func get(path: String,parameters: [String: AnyObject]? = nil,delegate: APIProtocol? = nil){
  let url = "\(self.hostname)\(path)"
  NSLog("Preparing for GET request to: \(url)")

  Alamofire.request(.GET,url,parameters: parameters)
    .responseJSON { (req,res,json,error) in
      if(error != nil) {
        NSLog("GET Error: \(error)")
        println(res)
      }
      else {
        var json = JSON(json!)
        NSLog("GET Result: \(json)")

        // Call delegate if it was passed into the call
        if(delegate != nil) {
            delegate!.didReceiveResult(json)
        }
      }
    }
}

// Step 3
class ActivityViewController: UITableViewController,APIProtocol {
  var activityModelList: NSMutableArray = [] // This is the array that my tableView is using.

  ... 

  func didReceiveResult(result: JSON) {
    var activities: NSMutableArray = []

    NSLog("Activity.didReceiveResult: \(result)")

    for (index: String,activity: JSON) in result {

      var activityModel = ActivityModel(
        id: activity["id"].intValue,message: activity["message"].stringValue
      )

      activities.addobject(activityModel)
    }

    // Set our array of new models
    activityModelList = activities

    // Make sure we are on the main thread,and update the UI.
    dispatch_sync(dispatch_get_main_queue(),{
      self.refreshControl!.endRefreshing()
      self.tableView.reloadData()
    })
  }
}

// Step 4
override func viewDidLoad() {
  MyAPI.get("/activities",delegate: self)
}

今天关于iOS(Swift)学习笔记之SwiftyJSON的使用ios swift 教程的介绍到此结束,谢谢您的阅读,有关iOS 15 中 Swift 和 SwiftUI 的使用情况、ios – SwiftyJSON字典解析、ios – SwiftyJSON性能问题、ios – Swift:使用Alamofire和SwiftyJSON处理JSON等更多相关知识的信息可以在本站进行查询。

本文标签: