table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、为什么花时间处理用户需求如此重要?
在开发过程开始时与所有业务利益相关者一起处理用户需求,有助于首次就将应用程序设计正确。
让所有利益相关者从一开始就参与到每个视图中,可避免多次重写和减少应用程序的漏洞。
此外,苹果建议开发者至少将 50% 的开发时间用于用户界面的设计和开发,这也体现了重视用户需求的重要性。
2、设计需求和算法之间的区别是什么?
以下是调整为 Markdown 格式的文本内容:
算法是在编写计算机程序前,将程序要执行的步骤按顺序列出的逐步过程,例如制作烤面包程序的步骤。
但算法可能会遗漏很多细节并做出许多假设。
而设计需求能帮助开发者明确应用程序完成时应该做什么和不应该做什么,可正式详细,也可简单如纸上的列表,它应由开发者、用户和客户协作产生。
3、方法和属性的区别是什么?
对对象执行的操作称为
方法
,方法用于操纵对象以实现应用程序的功能;
而描述对象的数据被定义为
属性
,每个属性以特定方式描述相关对象。
例如,对于喷气式飞机对象:
方法
:
goUp
、
goDown
等;
属性
:
altitude
、
heading
等。
4、什么是bug?
程序编写的内容与程序实际要实现的功能不符,导致程序崩溃或无法达到预期效果,此时程序被认为存在bug。在编程术语中,错误也被称为bug,是编程产生的非预期结果,应用程序发布到App Store之前必须修复这些问题。
5、什么是状态(state)?
对象属性在特定时间存储的值统称为对象的状态(state),状态是计算机编程中的一个重要概念。
6、编写一个算法,描述从投入硬币到售出汽水这段时间内汽水机的工作原理。假设汽水价格为80美分。
以下是一个简单的汽水机工作算法:
开始
等待用户插入硬币
累加投入的硬币金额
判断累计金额是否达到80美分:
– 若未达到,返回步骤2继续等待插入硬币
– 若达到,进入下一步
等待用户选择汽水
检查所选汽水是否有库存:
– 若没有库存,提示用户重新选择,返回步骤5
– 若有库存,进入下一步
释放所选汽水
若有找零,进行找零操作
结束
7、在 Swift playground 中编写代码,对一个浮点数进行平方运算,并显示结果浮点数。
以下是示例代码:
let floatNumber: Float = 3.5
let squaredFloat = floatNumber * floatNumber
print(squaredFloat)
8、在 Swift playground 中编写代码,对两个浮点数进行减法运算,并将结果存储为整数。注意,不进行四舍五入。
以下是实现该功能的 Swift 代码示例:
let firstFloat: Float = 5.8
let secondFloat: Float = 2.3
let resultAsInt = Int(firstFloat - secondFloat)
print(resultAsInt)
在这个示例中,我们定义了两个浮点数
firstFloat
和
secondFloat
,然后将它们相减的结果转换为整数类型存储在
resultAsInt
中,最后打印出结果。由于使用
Int()
进行转换时不会进行四舍五入,而是直接截断小数部分。
9、清除程序中“Label”的默认文本并重新运行示例。
可回到界面清除默认标签文本,然后点击 Xcode 窗口左上角类似播放按钮的运行按钮,程序会自动保存文件并在 iPhone 模拟器中启动应用。
10、更改当前按钮并添加一个新按钮。将按钮分别标记为 FM 和 AM。如果用户点击 FM 按钮,显示一个 FM 电台;如果用户点击 AM 按钮,显示一个 AM 电台。(提示:你需要在 ViewController.swift 文件中添加第二个 RadioStation 对象。)
在
ViewController.swift
文件中添加第二个
RadioStation
对象,然后对两个按钮(标记为FM和AM)分别添加点击事件处理逻辑:
当点击FM按钮时,调用相关逻辑显示FM电台信息;
当点击AM按钮时,调用相关逻辑显示AM电台信息。
11、通过确保用户在iPhone应用程序首次启动时看不到文本“Label”来稍微清理一下界面。
可以回到界面中清除默认标签文本。
12、增强 Book 类,使其能够存储另一个属性,例如价格或 ISBN。
在
Book
类中添加存储信息的属性,如价格、ISBN 等;在
Book
实体中添加新的属性,如价格等,并确保实体名称首字母大写。
13、修改DetailViewController,以便显示新字段。请记住将界面控件连接到实例变量。
在
DetailViewController
类中添加属性的步骤如下:
点击Xcode右上角的助理编辑器图标(看起来像两个圆圈)打开助理编辑器,确保
DetailViewController.swift
文件显示在编辑器中。
按住Control键,将第一个空白标签控件拖到右侧的代码中,将其命名为
titleLabel
并点击“Connect”,然后对第二个重复此过程,命名为
authorLabel
,这将为
DetailViewController
类添加两个变量并将它们与界面中的标签控件挂钩。
在
DetailViewController
类中添加新属性代码,示例如下:
@IBOutlet weak var pagesOutlet: UILabel!
@IBOutlet weak var switchOutlet: UISwitch!
var delegate: Any? = nil
var myBook = Book()
添加
DetailViewController
的“Pages”、“Read”和“Edit”控件,通过将空心圆圈拖到它们的控件来连接出口。
14、提供一种从列表中移除元素的方法,假设列表存储在
myBookStore.theBookStore
数组中,且使用
tableView
展示列表数据,同时有一个
DetailViewController
用于显示详情,要求移除选中元素后重新加载
tableView
数据并将
DetailViewController
从导航栈中弹出。
myBookStore.theBookStore
tableView
DetailViewController
tableView
DetailViewController
可通过调用
deleteBook
函数来移除元素。该函数首先确定
tableView
中被选中的行,使用
indexPathForSelectedRow
方法获取选中行的索引,然后调用
removeAtIndex
方法从
myBookStore.theBookStore
数组中移除对应索引的元素,最后重新加载
tableView
数据并将
DetailViewController
从导航栈中弹出。
示例代码如下:
func deleteBook(controller: AnyObject) {
let indexPath = self.tableView.indexPathForSelectedRow
var row = indexPath?.row
myBookStore.theBookStore.removeAtIndex(row!)
self.tableView.reloadData()
let myController = controller as! DetailViewController
myController.navigationController?.popToRootViewControllerAnimated(true)
}
15、如何通过使用Core Data或NSUserDefaults为应用程序添加持久化功能?
若使用
NSUserDefaults
,可用于保存和读取偏好设置,在 iOS 和 OS X 泻统中,可借助
NSUserDefaults
将偏好信息保存到文件中并进行读取。
若使用 Core Data,步骤如下:
在
ViewController.swift
文件顶部,
import UIKit
下方添加
import CoreData
。
在
ViewController
类的
class ViewController
行之后添加:
swift
var managedObjectContext: NSManagedObjectContext!
在
override func viewDidLoad()
方法中添加以下代码实例化
managedObjectContext
:
swift
let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
managedObjectContext = appDelegate.managedObjectContext as NSManagedObjectContext
可添加
loadBooks
方法查询数据库记录,示例代码如下:
swift
func loadBooks() -> [AnyObject] {
let fetchRequest = NSFetchRequest(entityName: "Book")
var result = [AnyObject]()
do {
result = try managedObjectContext!.executeFetchRequest(fetchRequest)
} catch let error as NSError {
NSLog("My Error: %@", error)
}
return result
}
16、在详情场景中设置标签以显示所有数据
添加标签对象属性的步骤
可按以下步骤为详情视图控制器类添加对应标签对象的属性:
点击Xcode右上角的助理编辑器图标(看起来像两个圆圈)打开助理编辑器,确保详情视图控制器对应的
.swift
文件显示在编辑器中。
按住Control键,将第一个空白标签控件拖到右侧代码处,命名为
titleLabel
并点击Connect,对第二个标签重复此过程,命名为
authorLabel
,这会为详情视图控制器类添加两个变量并将它们与界面中的标签控件关联。
之后,先将三个标签对象拖到界面上用于显示书籍标题、作者和描述,然后从详情控制器场景控制拖动到每个标签并将它们分配给各自的属性。
17、向你的书店应用中添加更多书籍,以便在应用中体验滚动效果。
你可以回到 BookStore.swift 文件中添加更多书籍,从而体验应用的滚动效果。
18、Enable the users to set visual and audible alarms when their heart rate gets too high
让用户在心率过高时设置视觉和听觉警报
19、编写一个用于运行汽水机的应用程序的设计要求。
以下是一个用于运行汽水机的应用程序的设计要求示例:
视图
:主视图。
描述
:
显示汽水机内所有汽水的种类、价格和库存数量。库存数量根据销售情况实时更新。当某种汽水库存为 0 时,该汽水选项显示不可选状态。
功能
:
支持用户选择汽水种类和数量,输入投入的硬币金额。若投入金额足够,提示用户选择成功并准备出货;若投入金额不足,提示用户继续投入硬币。出货后,自动更新库存和投入金额状态。
反馈
:
在用户操作后,通过界面提示信息告知操作结果,如出货成功、金额不足等。
异常处理
:
当汽水机出现故障(如出货卡住)时,界面显示故障提示,并可通过特定按钮联系维修人员。
20、在 Swift playground 中编写代码,将两个整数相乘并显示结果。
let num1 = 5
let num2 = 3
let result = num1 * num2
print(result)
21、规划一个作者类。选择你需要存储的关于作者的信息类型。
一般可存储作者姓名、国籍、出生日期、代表作、简介等信息。
22、尝试创建一个名为PrintedMaterials的超类。规划出这个类可能拥有的属性。
可能有标题、出版日期、页数等属性。
23、为商店可能出售的其他类型印刷品创建类。
可创建如杂志(Magazine)类、报纸(Newspaper)类等
杂志类可包含属性如刊号、发行周期等
报纸类可包含出版日期、版面数量等属性
24、如果你觉得自己已经掌握了相关知识,为视图控制器对象和界面添加一个新的按钮和标签。将标签显示的内容从你的名字改为其他内容。
添加新按钮步骤:
先在实用工具窗口中点击按钮对象。
然后将其拖到iPhone视图上,拖动会在iPhone界面创建该对象的新副本。
修改按钮标题:
双击刚添加到iPhone界面的按钮对象,即可更改按钮标题。
添加新标签及修改显示内容:
创建标签对象连接时,可通过右键点击iPhone界面上的标签对象,调出连接菜单。
将视图控制器的
nameLabel
出口连接到iPhone界面上的对象。
修改显示内容:
可在Interface Builder中双击标签进行修改。
也可以在代码中修改。
25、为 @IBAction func buttonClick(sender: AnyObject) 方法添加更多验证。目前该方法仅验证 FM 频段,未验证 AM 频段。修改代码,使其也能验证 AM 频段。
一般而言,若要验证 AM 频段,需先明确 AM 频段的范围(通常为 535 – 1705 kHz),接着在
buttonClick
方法里添加逻辑:
判断用户输入的频率是否处于该范围内。
若输入频率小于 535 或大于 1705,则判定为
超出 AM 频段范围
。
给出相应提示。
26、在主场景中,移除编辑按钮,因为我们不会在这个应用程序中使用它。
可在Xcode界面的主场景里找到编辑按钮并删除。
27、修改 BookStore 对象,使其调用一个单独的方法来初始化 Book 对象列表(而不是将所有初始化代码都放在 init 方法中)。
可在
BookStore
类中定义一个新的方法,将初始化
Book
对象列表的代码从
__init__
方法移到该新方法中,然后在需要初始化时调用这个新方法。
28、UITableViewCell 有一个名为 detailTextLabel 的属性,如何通过设置其 text 属性来使用它,请给出 Swift 代码示例。
在 Swift 中可以通过以下代码设置:
cell.detailTextLabel?.text = "要设置的文本"
其中
cell
是
UITableViewCell
的实例。
29、使用Xcode修改界面,尝试在故事板文件中更改DetailViewController的背景颜色。
在Xcode中可按以下步骤操作:
打开故事板文件。
找到
DetailViewController
对应的视图。
在属性检查器中找到
背景颜色
属性。
点击颜色选择器,选择想要的颜色。
30、对 BookStore 对象中的书籍进行排序,使它们在主细节视图(MasterDetailView)上按升序显示。
可定义排序规则并在合适时机对 BookStore 中的书籍数组排序,如按书名排序可使用 Swift 的
sorted
方法:
let sortedBooks = myBookStore.theBookStore.sorted { $0.title < $1.title }
然后更新数据源并刷新表格视图。
31、修改示例应用程序以比较一些字符串信息。这可以是变量或常量的形式。
以下是比较字符串信息的示例代码:
var enteredPassword = "Duck"
var myPassword = "duck"
var continueLogin = false
if enteredPassword == myPassword {
continueLogin = true
}
你可以根据需求修改字符串变量或常量的值,来进行不同的字符串比较。也可以使用字符串的其他方法,如检查字符串长度:
var enteredPassword = "Duck"
var myPassword = "duck"
var continueLogin = false
if enteredPassword.characters.count > 5 {
continueLogin = true
}
32、扩展随机数生成器应用程序,使其在应用启动时在标签对象中显示日期和时间。
可在应用启动相关方法里获取当前日期和时间,并将其赋值给标签对象的文本属性。在iOS开发里,可在
ViewController
的
viewDidLoad
方法中实现,示例代码(Swift)如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var dateTimeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
let currentDate = Date()
let dateTimeString = dateFormatter.string(from: currentDate)
dateTimeLabel.text = dateTimeString
}
}
要保证
dateTimeLabel
和界面上的标签对象已通过
IBOutlet
建立连接。
33、在显示日期和时间标签后,添加一个按钮来用新时间更新日期和时间标签。
一般步骤如下:
在界面设计工具中添加一个按钮,设置其标题等属性;
在代码中为按钮添加点击事件处理方法;
在该方法里获取当前的日期和时间;
然后将其赋值给日期和时间标签来更新显示。
不同开发环境和编程语言的具体实现代码会有所不同。
34、使应用程序能够从 HealthKit 存储中读取数据,需要怎么做?
通常需在应用中请求用户授权访问 HealthKit 存储,使用相应的 API 来读取所需数据。
35、使应用程序能够连接和断开与心率监测器的连接
在代码中,通过
centralManager.scanForPeripheralsWithServices
方法扫描外设以尝试连接心率监测器,当发现外设时,在
didDiscoverPeripheral
函数中设置连接的外设并调用
connectPeripheral
方法进行连接;若要断开连接,可在相应逻辑中添加断开连接的代码。
如代码片段:
扫描外设:
swift
centralManager.scanForPeripheralsWithServices(serviceUUIDs, options: nil)
连接外设:
swift
centralManager.connectPeripheral(connectingPeripheral, options: nil)