定义你的数据模型jy02432443

在本课程中,您将定义和测试的应用程序FoodTracker数据模型。一个数据模型表示在APP中的的信息结构。

学习目标

在课程结束时,你将能够:

1.创建数据模型2.写failable初始化一个自定义类3.证明failable和nonfailable的不同,理解他们之间的差异和概念4.通过编写和运行单元测试来测试数据模型

创建一个数据模型

现在你需要创建一个数据模型来存储菜谱场景所需要显示的信息。要做到这一点,我们需要定义个简单的类,里面有name,photo,rating

创建一个新的数据模型类

1.选择File>New>File(或按下Command+N)

2在对话框左边,选择iOS下的Source

3.选择SwiftFile,然后点击下一步

和前面创建RatingControl所不同,对于数据模型,我们不需要继承其他类

4.在Saveas旁,键入Meal

5.默认保存位置是项目目录,Group默认选择为你的App名字FoodTracker,在Target选择,确保app和tests都被选中

6.点击Create。Xocde会创建一个名叫Meal.swift的文件

在Swift中,你能使用一个String表示一个name,使用UIImage表示photo,使用Int表示rating。因为一个菜谱总是会有一个name和rating。但不一定会有图片。所以UIImage是可选的

为菜谱定义数据模型

1.打开Meal.swift

2.修改导入语句为UIKit

importUIKit默认1个Swift文件会导入为Foundation框架,它使你能够使用基础数据结构。你需要使用UIKit框架中的类,所以你需要导入UIKit,同时UIKit也能让你访问Foundation,因此你可以移除这个多余的Foundation语句

3.然后添加如下代码:

classMeal{//MARK:Propertiesvarname:Stringvarphoto:UIImagevarrating:Int}代码定义了你需要存储的基础属性。你使用变量(var)而不是常量(let),因为他们在整个菜谱的生命周期中会发生改变

4.在属性代码下方,添加如下初始化代码:

//MARK:Initializationinit(name:String,photo:UIImage,rating:Int){}回忆一个初始化方法,当一个类的实例准备初始化时,我们可以为每个属性设置一个初始化值,或执行一些设置和初始化操作

5.通过参数值来给基础属性赋值

//Initializestoredproperties.self.name=nameself.photo=photoself.rating=rating如果你尝试使用不正确的值来创建一个菜谱,会发生如一个空的name或负数的rating。你需要返回nil来表示item不能被创建,也不能设置为默认值。你需要添加代码来检查一些失败的情况

6.在初始化结束的地方,加入if语句来检查无效值

//Initializationshouldfailifthereisnonameoriftheratingisnegative.ifname.isEmpty||rating<0{returnnil}因为初始化函数中可能返回nil,所以你需要在初始化函数指出标识

7.点击fix-it,在init关键字后面来添加(?)

init(name:String,photo:UIImage,rating:Int){这个初始化程序被称为failableinitializer,它表示这个初始化程序可能会返回nil

现在整体init函数,应该如下所示:

//MARK:Initializationinit(name:String,photo:UIImage,rating:Int){//Initializestoredproperties.self.name=nameself.photo=photoself.rating=rating//Initializationshouldfailifthereisnonameoriftheratingisnegative.ifname.isEmpty||rating<0{returnnil}}测试你的数据

虽然你的数据模型编译了,但你还没有完全将其纳入到你的APP中。因此,很难判断是否已正确实现一切,在运行时你可能会遇到,没有考虑的边缘情况。

为了解决这种不确定性,你可以写单元测试,单元测试用于测试小的,独立的代码片段,以确保他们的行为正确。菜谱类正好是单元测试一个完美的候选人。Xcode已经帮你创建了一个单元测试文件

查看FoodTracker中的单元测试中的文件

1.打开FoodTrackerTests文件夹,通过点击三角形,展开里面的列表

2.打开FoodTrackerTests.swift

importUIKitimportXCTestclassFoodTrackerTests:XCTestCase{overridefuncsetUp(){super.setUp()//Putsetupcodehere.Thismethodiscalledbeforetheinvocationofeachtestmethodintheclass.}overridefunctearDown(){//Putteardowncodehere.Thismethodiscalledaftertheinvocationofeachtestmethodintheclass.super.tearDown()}functestExample(){//Thisisanexampleofafunctionaltestcase.XCTAssert(true,"Pass")}functestPerformanceExample(){//Thisisanexampleofaperformancetestcase.self.measureBlock(){//Putthecodeyouwanttomeasurethetimeofhere.}}}

我们导入的XCText框架,是Xcode的测试框架。单元测试会定义在FoodTrackerTests类中,它继承自XCTestCase,代码注释解释了setUp()和tearDown()方法

你写的功能测试(用来检查一切产生的值是否符合你的预期)和性能测试(检查你代码的性能是不是符合你预期那样快)是主要的测试类型。因为你没有写任何耗性能的代码,所以这样你只要写功能测试即可。

一般在我们的测试方法前,会加上text前缀,如我们先要测试init方法,会这么写testMealInitialization

为菜谱对象的初始化函数编写单元测试

1.在FoodTrackerTests.swift中,删除测试模版

importUIKitimportXCTestclassFoodTrackerTests:XCTestCase{}本例中,我们不使用任何模版代码

2.在类中,添加如下方法

//TeststoconfirmthattheMealinitializerreturnswhennonameoranegativeratingisprovided.functestMealInitialization(){}添加注释是一个好习惯,可以帮助你或其他浏览你代码的人,看懂你这个方法的意思,是要做什么

3.首先添加一个通过的测试用例。添加注释

//Successcase.letpotentialItem=Meal(name:"Newestmeal",photo:nil,rating:5)XCTAssertNotNil(potentialItem)XCTAssertNotNil是测试Meal对象在初始化后不为nil,这意味这你提供的参数会在初始化程序中成功创建一个Meal对象。

4.现在添加一个Meal失败的测试用例。添加如下代码:

//Failurecases.letnoName=Meal(name:"",photo:nil,rating:0)XCTAssertNil(noName,"Emptynameisinvalid")XCTAssertNil断言这个对象是nil。本例中,意思是noName这个对象为nil,意味着它初始化失败。你期望这个初始化失败,因为这个名字是一个空字符串,你明确地针对初始程序测试。

5.我们在添加一个测试失败的用例,但这次我们断言他会成功:

letbadRating=Meal(name:"Reallybadrating",photo:nil,rating:-1)XCTAssertNotNil(badRating)你期望这个用例会失败,因为rating为负数

您可以通过按下Command-U在运行单元测试。最后一个测试用例预期失败,因为你断言对象非nil,它实际上是nil。

运行单元测试

1.在FoodTrackerTests.swift中,找到testMealInitialization()单元测试

2.在测试名称的左边,找到一个菱形

3.将鼠标悬停在菱形上会出现一个小的运行按钮

4.点击这个执行按钮来运行单元测试

检查站:你的应用程序运行在你刚刚编写的单元测试上。前两个测试用例应该通过,最后应该失败。

正如你所看到的,单元测试有助于捕获代码中的错误。如果你真的希望在最后一个测试中的对象是非nil,你会在测试过程中发现这个错误。(在这种情况下,是因为你故意写了一个失败的测试案例,你可以回头去解决你的测试案例)

修复测试用例

1.在FoodTrackerTests.swift中找到testMealInitialization()

2.修改代码为

XCTAssertNil(badRating,"Negativeratingsareinvalid,bepositive")

完整的方法看起来应该是这样:

//TeststoconfirmthattheMealinitializerreturnswhennonameoranegativeratingisprovided.functestMealInitialization(){//Successcase.letpotentialItem=Meal(name:"Newestmeal",photo:nil,rating:5)XCTAssertNotNil(potentialItem)//Failurecases.letnoName=Meal(name:"",photo:nil,rating:0)XCTAssertNil(noName,"Emptynameisinvalid")letbadRating=Meal(name:"Reallybadrating",photo:nil,rating:-1)XCTAssertNil(badRating,"Negativeratingsareinvalid,bepositive")}检查站:运行你刚刚编写单元测试。所有的测试用例应该会通过。

THE END
1.素食生活新篇章:20道纯素家庭餐,让你享受绿色降的美味素食生活新篇章:20道纯素家庭餐,让你享受绿色健康的美味 随着人们健康意识的提高和环保理念的普及,越来越多的人开始尝试素食生活。素食不仅有益于身体健康,还能减少对环境的负担。下面就为大家介绍20道纯素家庭餐,让你享受绿色健康的美味。素炒时蔬 这道菜是一道简单易做的素菜,用时令蔬菜翻炒而成,口感清新https://baijiahao.baidu.com/s?id=1782721300472461171&wfr=spider&for=pc
2.菜单菜谱类专题模板菜单菜谱类图片素材下载我图网菜单菜谱类专题为您整理了6200个原创高质量菜单菜谱类图片素材供您在线下载,PSD/JPG/PNG格式菜单菜谱类模板下载、高清菜单菜谱类图片大全等,下载图片素材就上我图网。https://so.ooopic.com/search-b2cbb5a5b2cbc6d7c0e0-16-0_0____0_ooo_0_1_.html
3.菜谱类app竞品分析报告通过下图可以看出,下厨房以155.5万的平均DAU在菜谱app市场渗透率top5的应用中一马当先,豆果美食和香哈菜谱过去半年的平均DAU分别为50.6万和40.9万,下厨房平均DAU超过其余四款主流菜谱app的总和。 通过观察下图中的数据发现,目前市场上的菜谱类app基本能满足目标用户的需求,89.1%的用户仅安装一款菜谱app,而不是同时安装https://www.jianshu.com/p/7285f39269da
4.食堂菜单菜谱食堂菜单菜谱类别推荐在我们的日常生活中,食堂不仅仅是一个提供食物的地方,它也是我们日常生活的一部分,是我们在忙碌的学习或工作中能够找到片刻休息的地方,而食堂的菜谱,则是我们了解食堂提供的食物种类和口味的重要途径,我将为大家带来我们食堂的菜单菜谱,让我们一起看看有哪些美味而又健康的菜品等待着大家。 https://www.coffee.cn/xican/post/325259.html
5.菜谱类(下厨房)菜谱类来自爱吃就得自己做 收藏全部菜谱 10分钟出锅的【西芹腰果炒虾仁】,清甜脆爽好吃不胖 菜菜美食日记 8.6 综合评分 (129 人做过) 四川回锅肉 圆猪猪 8.1 综合评分 (11748 人做过) 回锅肉 下厨房用户_geqhb 8.1 综合评分 (5284 人做过) 水煮肉片(肯定不翻车) 嫚丽1008 8.7 综合评分 (7244 人做https://m.xiachufang.com/recipe_list/110526281/
6.菜单计价程序:处理点菜折扣与异常菜谱类:对应菜谱,包含饭店提供的所有菜的信息。 Menu { Dish[] dishs ;//菜品数组,保存所有菜品信息 Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。 } 点菜记录类:保存订单上的一道菜品记录 Record { Dish d;//菜品 https://blog.csdn.net/qq_53190228/article/details/130853309
7.降蔬食丨10道素食菜谱,做法简单还好吃!9、最后加入适量水淀粉勾芡,煮至汤汁浓稠,最后撒上一把芹菜碎即可。 【来源:素食菜谱汇公众号】 攥稿 排版 责编 | 如金素心素语倡导素食生活,拯救生存环境;传播素食文化,地球生生不息。 静心|阅读|艺术|慈善|健康 有温度的活动 广州市静心读书协会 声明信https://mp.weixin.qq.com/s?__biz=MzIxMTEzMDQ4Mw==&mid=2653674170&idx=2&sn=67fbcf423b6743d8facfec36813f4c7a&chksm=8daf2a1b50cdc8fc382b583cff9badb95658a003f2f4ced5ffe3ec77dbbe1903e0d9889b4286&scene=27
8.书籍推荐9本我觉得还不错的食谱书(早餐/沙拉/中餐/日料/创意菜4.日式菜谱类(料理+汤) 神田裕行的四季料理 8.9 [日]神田裕行 / 2019 / 青岛出版社 笠原将弘的上品暖锅 7.8 [日]笠原将弘 / 2017 / 河南科学技术出版社 我其实从图书馆也借过不少食谱书,但唯一让我有想买的欲望的只有四季料理,这两本书的作者,一个神田裕行,一个笠原将弘都是有自己料理店的,果然https://www.douban.com/note/811294478/
9.2020舌尖经济洞察报告:美食人群占移动大盘总体的10%,2/3为90后4.2 跟着菜谱自己探索制作美食受到更多女性及年轻群体的喜欢,自主制作美食女性用户占比超六成,19-30岁年轻用户合计占比达54.9% 4.3 美食爱好者对美食菜谱类APP的使用主要集中在头部,人均单日使用时长较去年同期有所提升 5、体验分享:图文、短视频等多样式记录及分享美食心得 https://www.tmtpost.com/4791615.html