本篇文章给大家谈谈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 15 中 Swift 和 SwiftUI 的使用情况
- ios – SwiftyJSON字典解析
- ios – SwiftyJSON性能问题
- ios – Swift:使用Alamofire和SwiftyJSON处理JSON
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
包含unsupportedType
、indexOutOfBounds
、elementTooDeep
、wrongType
、notExist
、invalidJSON
、errorDomain
。
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 于 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字典解析
例如,假设从服务器返回的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性能问题
数据是与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不正确或者这是预期的吗?
解决方法
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
我使用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?
解决方法
>创建一个名为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等更多相关知识的信息可以在本站进行查询。
本文标签: