我试图掌握某种单元测试,因此我们创建模拟用户默认值。
class MockUserDefaults: UserDefaults {
var gameStyleChanged = 0
override func set(_ value: Int, forKey defaultName: String) {
if defaultName == "something" {
someStyleChanged += 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 setup() 之后我创建了
mockUserDefaults = MockUserDefaults(suiteName: "testing")!
Run Code Online (Sandbox Code Playgroud)
所以我很困惑,我无法理解 suiteName 的完整含义,我已阅读官方文档,但还不够清楚,请帮助
我的应用程序使用一个可编码的结构,如下所示:
public struct UserProfile: Codable {
var name: String = ""
var completedGame: Bool = false
var levelScores: [LevelScore] = []
}
Run Code Online (Sandbox Code Playgroud)
AJSONEncoder()已用于将UserProfiles的编码数组保存为用户默认值。
在即将到来的更新中,我想向这个UserProfile结构添加一个新属性。这在某种程度上可能吗?
或者我是否需要创建一个具有相同属性和一个新属性的新 Codable 结构,然后将所有值复制到新结构中,然后开始使用该新结构代替UserProfile之前使用该结构的任何地方?
如果我只是向结构体添加一个新属性,那么我将无法加载之前编码的UserProfiles数组,因为结构体将不再具有匹配的属性。当我使用此代码加载已保存的用户时:
if let savedUsers = UserDefaults.standard.object(forKey: "SavedUsers") as? Data {
let decoder = JSONDecoder()
if let loadedUsers = try? decoder.decode([UserProfile].self, from: savedUsers) {
Run Code Online (Sandbox Code Playgroud)
loadedUsers如果在UserProfile编码和保存时具有的属性不包含结构的所有当前属性,则不解码UserProfile。
有关更新保存的结构属性的任何建议?或者我必须走很长的路并重新创建,因为我之前没有提前计划要包含此属性?
谢谢你的帮助!
我有两个函数,其中一个函数基本上检索用户默认值中的字符串,另一个函数将字符串写入用户默认值中。我不明白我应该进行单元测试还是不进行?我对单元测试的概念还很陌生。
我在互联网上搜索测试用户默认值,但最后建议我模拟测试。
我的问题是,如果有办法测试用户默认值,最好的方法是什么?
常量和结构体
let defaults = UserDefaults.standard
let defaultinformation = "ABCDEFG"
struct Keys {
static let Information = "Information"
}
Run Code Online (Sandbox Code Playgroud)
保存信息的功能
func SetDefaultInformation() {
defaults.set(defaultinformation, forKey: Keys.Information)
}
Run Code Online (Sandbox Code Playgroud)
检索信息的函数
func checkForInformation() -> String {
let Information = defaults.value(forKey: Keys.Information) as? String ?? ""
return Information
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
这是我的应用程序的工作流程: 用户可以从应用程序的设置页面选择默认打印机,并且每次都会直接使用该默认打印机进行打印,而无需任何打印预览对话框。
我们可以使用以下方法选择打印机UIPrinterPickerController:
let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil)
printerPicker.present(from: CGRect(x: 0, y: 0, width: 600, height: 500), in: self, animated: true) { (printerPicker, userDidSelect, error) in
if userDidSelect {
//Here get the selected UIPrinter
let defaultPrinter = printerPicker.selectedPrinter
}
}
Run Code Online (Sandbox Code Playgroud)
获取后UIPrinter,我们不能直接将UIPrinter对象保存到UserDefaults,这不是UserDefault支持类型。
是否有任何其他选项可以保存UIPrinter到用户默认值或任何其他方式来保存默认打印机。
我已经用套件创建了 UserDefaults,
self.moviesWatchedUserDefaults = UserDefaults(suiteName: "com.apple.tv.2020")
Run Code Online (Sandbox Code Playgroud)
并将信息存储在 plist 中,例如
self.moviesWatchedUserDefaults.set(data, forKey: key).
Run Code Online (Sandbox Code Playgroud)
现在,在检索时,我想检索所有键和值。我正在使用的,
var watchedList = self.moviesWatchedUserDefaults?.dictionaryRepresentation()
Run Code Online (Sandbox Code Playgroud)
但返回的列表不仅包含我存储的项目,还包含其他键,如NSLanguages、AppleKeyboards、AppleKeyboardsExpanded、CarCapabilities等,
如何检索所有键和值(仅我存储的键和值)?
我有一个 ios 14 小部件,每 5 分钟刷新一次
let timeline = Timeline(entries: entries, policy: .atEnd)
Run Code Online (Sandbox Code Playgroud)
这entries取决于我的 MainApp 上的配置。
我用来UserDefaults在 MainApp 和 Widget 之间共享数据。
@AppStorage("FollowingCatalog", store: UserDefaults(suiteName: "group.vn.f19.com"))
var catalogItemsData: Data = Data()
Run Code Online (Sandbox Code Playgroud)
我已成功根据UserDefaults数据镜像小部件内容。但我的问题是我的小部件仅在 .atEnd 策略之后每 5 分钟刷新一次 UI
这会导致糟糕的用户体验
UserDefaults我的配置更改后如何立即刷新小部件内容?
感谢您的支持。
我正在 XCode 中开发一个应用程序,该应用程序显示从 URL 保存在 JSON 文件中的位置。我已将用户最喜欢的位置保存在 UserDefaults.standard.object(forKey: "heart") 中
SpotDetailView 上的心形按钮可保存该地点,并显示该地点是否为收藏夹。
import SwiftUI
struct SpotDetailView: View {
@State var spot: WindApp //knows which spot it's at
var spotname:String
@State var favourites: [String:String] = UserDefaults.standard.object(forKey: "heart") as? [String:String] ?? [:]
var body: some View {
ZStack {
List {
SpotMapView(coordinate: spot.locationCoordinate)
.cornerRadius(8)
ForEach(0..<9) { i in
SingleDayView(spot: spot, counter: (i * 8))
}
}
.navigationTitle("\(spot.spot)")
VStack {
Spacer()
HStack {
Spacer()
Button(action: {
if favourites[spot.spot] == "heart" {
favourites[spot.spot] = …Run Code Online (Sandbox Code Playgroud) 我在我的一个文件中使用了一个数组元组,并希望开始保存它UserDefaults.以下是我存储当前数据的方式:
typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()
Run Code Online (Sandbox Code Playgroud)
我已经研究过,发现我可能需要对以下内容进行一些保存:
NSKeyedArchiver.archivedDataWithRootObject
Run Code Online (Sandbox Code Playgroud)
这用于检索:
NSKeyedUnarchiver.unarchiveObjectWithData
Run Code Online (Sandbox Code Playgroud)
不确定这种方式是否有效,因为我的元组有多种数据类型.有关如何做到这一点的任何想法?
开始使用 Swift 和 SwiftUI,我发现从 UIKit 迁移的过程非常困难。目前被 UserDefaults 跺脚,即使在尝试理解我在网上找到的许多教程之后也是如此。
请告诉我我在这里做错了什么:非常简单的代码:
没有比这更简单的了。但我无法让它工作,因为对 UserDefaults 的调用会抛出此错误消息:
实例方法“appendInterpolation”要求“Bool”符合“_FormatSpecifiable”
我的“应用程序”是默认的单视图应用程序,有以下 2 处更改:
1- 在 AppDelegate 中,我注册了我的 bool :
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UserDefaults.standard.register(defaults: [
"MyBool 1": true
])
return true
}
Run Code Online (Sandbox Code Playgroud)
2- 在 ContentView 中,我尝试显示它(在 struct ContentView: View 中):
let defaults = UserDefaults.standard
var body: some View {
Text("The BOOL 1 value is : Bool 1 = \(defaults.bool(forKey: …Run Code Online (Sandbox Code Playgroud) 我有一堂课我想测试。它在其逻辑中使用 UserDefaults。我知道我必须注入一个测试替身来测试它,但我想不费太多力气就可以完成它。
如果可以制作一个仅在单元测试期间有效的临时 UserDefaults 实例,那将是最好的。或者我最终必须编写一个用于模拟的包装器?
userdefaults ×10
swift ×9
ios ×6
swiftui ×2
printing ×1
properties ×1
reload ×1
struct ×1
swift3 ×1
swift5 ×1
timeline ×1
unit-testing ×1
widget ×1
xctest ×1