【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记10 Property List

简介:   这一话来讲一个AnyObject的应用:Property List。property list不是任何一种类型,它属于一种工具类的东西。

  这一话来讲一个AnyObject的应用:Property List。


property list不是任何一种类型,它属于一种工具类的东西。它表面上是AnyObject,但是在后台,它是NSString、NSArray、NSDictionary、NSNumer、NSData和NSDate这六种类型中的一种,或者它们桥接到Swift中的版本。我们为什么要用property list呢,它看起来很笨重,我们需要大量的类型转换。

实际上有两个原因,第一property list要用来隐式地传递数据,就像浏览器中的cookie一样,它们只有创建者才知道如何解释它们的一组数据,只有创建者才知道里面具体是Int还是String之类的,其他人能看到的只有AnyObject,所以他们嫩过的就是把它传递给其他人。

另一个原因是property list可以用于泛型的数据结构,泛型的数据结构可以用来写入磁盘,或者通过网络传播。

property list在IOS中有一个很好用的东西叫做NSUserDefaults(我在UI专项训练这个系列中使用了NSUserDefaults来记录用户登录情况,从而判断是否加载引导页)。NSUserDefaults就像一个微型的数据库,它只会存储property list,存储那些诸如设置、用户信息的东西。由于它的性能不高,所以千万不要用它存储一些图片什么的比较大的数据,只用它来存储property list,比如日期、字符串、数字什么的。它可以像字典一样存储和导出property list,而且它本身就是一个字典。下面是它的一些方法。


它有一个key:value的字典,但是只存储property list。当你的APP关闭时,NSUserDefaults存储的东西依然存在,它永久保存这些数据。一般来说一个字典保存在堆中,当你的APP关掉它就消失了,但是这个保留着,所以说它像个数据库。

那么我们该如何使用它呢?


首先你使用standarUserDefaults这个方法,给你一个NSUserDefaults的实例。你总是使用同一个实例,然后你就可以给它发送消息,使用objectForKey来读取一个信息或者使用setObject来写一个信息。通常数据会自动保存,但是也有强制保存数据的办法aunchronize,类似于save方法。那么既然有自动保存为什么还需要强制保存呢,这是因为保存机制是当你的App从前台转到后台了,那时它会保存数据。因此它不会总在我们需要的时候保存数据,这就需要我们强制保存数据,因此这种方法是需要的。特别是当你debugging的时候,中断操作不会保存数据,我们需要做一些保存。何况synchronize操作代价并不高。

现在来展示一个Demo


在我们的计算器项目中,希望我们的CalculatorBrain能够给我们提供一个program,我们与这个program交互的数据都是AnyObject类型的,这样别人就看不到它到底是什么。

回到我们之前的Calculator项目中,在CalculatorBrain中添加如下代码:

    var program:AnyObject{//确保它是一个propertylist
        get{
        var returnValue = Array<String>()
            for op in opStack{
            returnValue.append(op.description)
            }
            return returnValue
        }
        set{
        
        
        }
    
    
    }

我们知道Array是一个AnyObject类型的,因为它被桥接过了。但是get中的代码显得有点多,之前介绍过一个叫做map的函数,正好派上用场,简化后的写法:

get{
            return opStack.map{$0.description}
        }

map后面是一个闭包,在闭包中把opStack中的每一个单个元素的字符描述返回到一个新的数组中。现在有人给我们返回了一个program,我们想要在其中加上我们的opStack,首先我们要确认的是别人给我们的这个数组中的数据类型。

var program:AnyObject{//确保它是一个propertylist
        get{
            return opStack.map{$0.description}
        }
        set{
            if let opSymbols = newValue as? Array<String>{
        var newOpStack = [Op]()
                for opSymbol in opSymbols{
                    if let op = knownOps[opSymbol]{
                    newOpStack.append(op)
                    } else if let operand = NSNumberFormatter().numberFromString(opSymbol)?.doubleValue {
                    newOpStack.append(.Operand(operand))
                    }
                
               opStack = newOpStack }
            }
        }
    
    
    }

set中的代码不打算细讲,如果你对计算器这个项目很熟悉的话应该是很好理解的。另外我们可以使用一种新的命名方式,那就是替身:

typealias PropertyList = AnyObject
    var program:PropertyList{//确保它是一个propertylist

这样更鲜明一点。


目录
相关文章
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
897 13
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1075 0
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
143 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
145 66
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。

热门文章

最新文章

  • 1
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    iOS8 中无需开源库的内置功能一览
  • 7
    iOS7应用开发7:自定义视图、手势操作
  • 8
    IOS小工具以及精彩的博客
  • 9
    Facebook SDK(iOS)初学讲解
  • 10
    iOS - Swift NSPoint 位置
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    28
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 7
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    235
  • 8
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 9
    深入探索iOS开发中的SwiftUI框架
    145
  • 10
    ios样式开关按钮jQuery插件
    60