【问题标题】:Does UserDefaults.integer work on 32-bit platforms?UserDefaults.integer 是否适用于 32 位平台?
【发布时间】:2020-06-19 19:16:30
【问题描述】:

以下代码可以在 32 位平台上运行吗?

class Account {
  private static let UserIDKey = "AccountUserIDKey"
  class var userID: Int64? {
    get { Int64(UserDefaults.standard.integer(forKey: UserIDKey)) }
    set { UserDefaults.standard.set(newValue, forKey: UserIDKey) }
  }
}

即,如果我将大于Int32.maxInt 值存储并检索到UserDefaults 中,它是否可以在32 位平台上运行?

我想知道,因为我只看到UserDefaults 实例方法integer(forKey:)。为什么UserDefaults 没有像int64(forKey:) 这样的实例方法?

【问题讨论】:

    标签: swift int nsuserdefaults


    【解决方案1】:

    您可以在用户默认值中保存许多简单的变量类型:

    • BooleansBool
    • integersInt
    • floatsFloat
    • doublesDouble
    • StringsString
    • binary 数据与Data
    • datesDate
    • URLsURL 类型
    • Collection 类型为 ArrayDictionary

      UserDefaults 类在内部只能存储 NSDataNSStringNSNumberNSDateNSArrayNSDictionary 类。

      这些是可以保存在属性列表中的对象类型。

    NSNumber 是一个 NSObject,它可以包含原始 C 风格的数字类型,甚至包括 C/Objective-C 风格的 BOOL 类型(存储 YESNO)。幸运的是,这些也桥接到 Swift,所以对于 Swift 程序,NSNumber 可以自动接受以下 Swift 类型:

    • UInt
    • 内部
    • 浮动
    • 布尔

    Dmitry Popov's answer in Quora

    还记得你在学校是如何学习如何将 38 和 54 等数字相加的。你使用不同的数字。您取最右边的数字 8 和 4,将它们相加,得到数字 2 作为答案,并且由于溢出而携带 1。您取第二个数字 3 和 5,将它们相加得到 8,并将进位的 1 相加得到结果 9,因此整个答案变为 92。32 位处理器的功能完全相同,但它不是十进制数字而是 32位整数,算法相同:分别处理 64 位数字的两个 32 位部分,通过从低位到高位携带来处理溢出。这需要几条 32 位指令,编译器负责对它们进行正确编码。


    Int64保存到UserDefaults

    import Foundation
    
    let defaults = UserDefaults.standart
    
    //Define an 64bit integer with `Int64`
    let myInteger: Int64 = 1000000000000000
    
    //Save the integer to `UserDefaults`
    defaults.set(myInteger, forKey: "myIntegerKey")
    
    // Get the saved value from `UserDefaults`
    guard let savedInteger = defaults.object(forKey: "myIntegerKey") as? Int64 else { return }
    
    print("my 64bit integer is:", savedInteger)
    

    通过转换为String将64位Int保存为UserDefaults

    let myInteger: Int64 = 1000000000000000
    let myString = String(myInteger)
    
    //Save the `myString` to `UserDefaults`
    UserDefaults.standard.set(myString, forKey: "myIntegerKey")
    
    
    // Get the value from `UserDefaults`
    let myString = UserDefaults.standard.string(forKey: "myIntegerKey")
    let myInteger = Int64(myString!)
    

    资源

    【讨论】:

    • 这是对“UserDefaults.integer 在 32 位平台上工作吗?”的回答吗?和“为什么 UserDefaults 没有像 int64(forKey:) 这样的实例方法?”?
    • 谢谢,但正如@Willeke 指出的那样,您没有回答我的问题。
    猜你喜欢
    • 2010-10-18
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2021-08-22
    • 2011-11-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多