Swift编程:自定义操作符与iOS 8欢迎应用开发
1. 自定义下标访问Box尺寸
可以使用自定义下标来访问和设置
Box
结构体的尺寸。以下是示例代码:
// Fig. 12.7: main.swift (Subscripts.xcodeproj)
// Using subscripts to access Box dimensions
var box = Box(length: 3.0, width: 4.0, height: 5.0) // create a Box
// show dimensions with Int subscript
println(“CREATED A BOX WITH THE FOLLOWING DIMENSIONS”)
println(“box[0] = \(box[0])”)
println(“box[1] = \(box[1])”)
println(“box[2] = \(box[2])”)
// set a dimension with the Int subscript
println(“\nSetting box[0] to 10.0”)
box[0] = 10.0
// set a dimension with the String subscript
println(“Setting box["width"] to 5.0”)
box[“width”] = 5.0
// show dimensions with String subscript
println(“\nBOX DIMENSIONS AFTER SETTING LENGTH AND WIDTH”)
print(“box["length"] = “)
println(box[“length”])
print(“box["width"] = “)
println(box[“width”])
print(“box["height"] = “)
println(box[“height”])
运行上述代码,输出结果如下:
CREATED A BOX WITH THE FOLLOWING DIMENSIONS
box[0] = 3.0
box[1] = 4.0
box[2] = 5.0
Setting box[0] to 10.0
Setting box[“width”] to 5.0
BOX DIMENSIONS AFTER SETTING LENGTH AND WIDTH
box[“length”] = 10.0
box[“width”] = 5.0
box[“height”] = 5.0
可以尝试使用无效的
Int
或
String
参数来调用这些下标,以触发下标前置条件失败并终止程序。
2. 自定义操作符
与许多支持操作符重载的编程语言不同,Swift允许创建自定义操作符。
2.1 优先级和结合性
每个内置操作符都有优先级和结合性。当重载现有操作符时,它具有与相应内置操作符相同的优先级和结合性。新创建的操作符也有优先级和结合性:
- 新的前缀或后缀一元操作符的工作方式与内置一元操作符相同,它们总是在表达式中的任何二元操作符之前应用,并且是非结合的。如果同时对同一个操作数应用一元前缀操作符和一元后缀操作符,则后缀操作符先应用。
- 对于每个新创建的二元中缀操作符,可以指定其优先级和结合性。
优先级值是一个介于0(最低)到255(最高)之间的整数值。如果未指定新操作符的优先级,默认值为100。所有内置操作符的优先级值在90 - 160范围内。结合性值可以是左(从左到右)、右(从右到左)或无(非结合)。如果未指定新操作符的结合性,默认值为无。
以下是优先级和结合性的总结表格:
| 操作符类型 | 优先级范围 | 默认优先级 | 结合性选项 | 默认结合性 |
| ---- | ---- | ---- | ---- | ---- |
| 内置操作符 | 90 - 160 | - | 左、右、无 | - |
| 新操作符 | 0 - 255 | 100 | 左、右、无 | 无 |
需要注意的是,如果在表达式中使用多个具有无结合性且相同优先级的操作符,会发生编译错误。例如,Swift的比较操作符是非结合的,因此不能编写像
0 > index < 10
这样的表达式。
2.2 自定义操作符使用的符号
许多符号可用于定义自定义操作符,包括各种ASCII字符和许多Unicode字符范围。可以用作操作符名称开头(即操作符头)的ASCII字符如下:
/ = - + ! * % < > & | ^ ~ ? ..
操作符头后面可以跟一个或多个操作符字符,这些字符可以是上述列出的任何操作符头字符,也可以是其他Unicode字符范围内的字符。不过,Swift保留了一些符号,不能用于重载或定义自定义操作符,例如
=, ->, //, /*, */
和点号(
.
)。同时,不能定义名为
<, &
或
?
的自定义一元前缀操作符,不能定义名为
?
的自定义二元中缀操作符,也不能定义名为
>, !
或
?
的自定义一元后缀操作符。
2.3 为Int类型定义自定义指数操作符
下面的代码展示了如何声明一个新的二元中缀指数操作符
**
,并定义一个操作符函数来实现该操作符对
Int
值的功能:
// Fig. 12.8: CustomOperator.playground
// Creating an exponentiation operator for type Int
// declare new infix ** operator for exponentiation; precedence of 160 is
// higher than * and /; associativity is none
infix operator ** {precedence 160 associativity none}
// define operator function that implements the new ** operator for Ints
func **(base: Int, exponent: Int) -> Int {
precondition(exponent >= 0, “exponent must be >= 0”)
if exponent == 0 {
return 1
} else {
var result = 1
for _ in 1…exponent {
result *= base
}
return result
}
}
// testing the custom infix exponentiation operator **
println(“2 ** 0 = \(2 ** 0)”)
println(“2 ** 10 = \(2 ** 10)”)
运行上述代码,输出结果如下:
2 ** 0 = 1
2 ** 10 = 1024
声明新操作符时,必须以
infix
、
prefix
或
postfix
声明修饰符开头,后跟
operator
关键字、操作符符号和一组花括号。对于一元前缀或后缀操作符,花括号为空但必须存在。对于二元中缀操作符,花括号中可以可选地包含
precedence
关键字和优先级级别(0 - 255),以及
associativity
关键字和左、右或无。在上述代码中,使用优先级160是因为它高于乘法(
*
)、除法(
/
)和取余(
%
)操作符的优先级。
创建自定义操作符的操作符函数时,该函数的参数列表指定操作数的类型。上述代码中的操作符函数要求指数为非负数,使用
precondition
函数确保这一点。如果指数为0,函数返回1;否则,使用循环计算结果。可以尝试使用负指数来触发前置条件失败并终止程序。
3. 自定义泛型操作符
前面的示例为
Int
类型实现了自定义指数操作符。还可以使用泛型和类型约束来实现支持多种类型的操作符。以下是实现代码:
// Fig. 12.9: CustomOperator.playground
// Creating an exponentiation operator for all SignedIntegerTypes
// declare new infix ** operator for exponentiation; precedence of 160 is
// higher than * and /; associativity is none>
infix operator ** {precedence 160 associativity none}
// define operator function that implements ** operator for integer types
func **<T: SignedIntegerType>(base: T, exponent: Int) -> T {
precondition(exponent >= 0, “exponent must be >= 0”)
if exponent == 0 {
return T(1)
} else {
var result = T(1)
for _ in 1…exponent {
result *= base
}
return result
}
}
// testing the custom infix exponentiation operator **
let intValue = 2
let int64Value = Int64(10)
println(“intValue ** 0 = \(intValue ** 0)”)
println(“int64Value ** 10 = \(int64Value ** 10)”)
运行上述代码,输出结果如下:
intValue ** 0 = 1
int64Value ** 10 = 10000000000
该代码的关键区别在于操作符函数的泛型参数子句,它对泛型类型
T
施加了类型约束,表明该函数的
base
参数可以接收符合Swift标准库
SignedIntegerType
协议的类型的参数。Swift类型
Int
、
Int8
、
Int16
、
Int32
和
Int64
都符合该协议。
4. iOS 8应用开发:欢迎应用
接下来将介绍如何开发一个简单的iOS 8欢迎应用,该应用的开发目标如下:
- 使用Xcode集成开发环境(IDE)编写、测试和调试iOS应用。
- 使用单视图应用项目模板快速开始开发新应用。
- 创建一个可以在iPhone、iPod touch和iPad上运行的通用应用。
- 使用Interface Builder、故事板和自动布局直观地设计应用的用户界面(无需编程)。
- 在用户界面中显示文本和图像。
- 支持纵向和横向两种方向。
- 编辑Cocoa Touch用户界面组件的属性。
- 在iOS模拟器中构建和启动应用。
- 通过指定字符串描述,使应用对视力障碍人士更具可访问性,以便与iOS的VoiceOver配合使用。
- 支持国际化,使应用可以根据用户的设备设置以不同语言显示字符串。
以下是开发该应用涉及的技术概述:
graph LR
A[Xcode和Interface Builder] --> B[创建项目]
A --> C[构建用户界面]
D[Labels和Image Views] --> E[显示文本]
D --> F[显示图像]
G[Asset Catalogs和Image Sets] --> H[管理图像资源]
I[运行应用] --> J[在模拟器中测试]
I --> K[在设备上运行]
L[可访问性] --> M[支持VoiceOver]
N[国际化] --> O[显示不同语言字符串]
4.1 Xcode和Interface Builder
Xcode是用于创建新项目的IDE,其集成的Interface Builder可用于构建简单的用户界面,包括文本和图像。可以使用Interface Builder的故事板功能来设计应用的UI,通过拖放标签、图像视图、按钮、文本字段、滑块等UI组件到应用的UI上。
4.2 Labels和Image Views
应用的文本显示在
UILabel
对象中,图像显示在
UIImageView
对象中。使用Interface Builder将标签和图像视图拖放到UI上,每个组件将占据屏幕的一半,并且iOS的自动布局功能会在用户旋转设备时保持这种大小关系。还可以编辑UI组件的属性,如标签的文本属性和图像视图的图像属性,以自定义应用。
4.3 Asset Catalogs和Image Sets
应用安装在设备上时,其图标和名称会显示在iOS主屏幕上。可以在应用设置中指定应用的图标。应用图标会根据设备和显示上下文以不同的大小和分辨率显示。iOS支持资产目录,用于管理需要不同分辨率的图像资源。资产目录包含图像集,iOS会根据运行应用的设备和图标使用的上下文自动选择合适的图像。如果没有为每个大小和分辨率提供图标,iOS会缩放提供的图像,使用最接近所需大小的图像。
4.4 运行应用
构建应用后,可以在iOS模拟器中运行,该模拟器可用于测试iPhone和iPad应用。如果是付费iOS开发者计划成员,还可以在iOS设备上运行应用。
4.5 可访问性
iOS包含许多可访问性功能,帮助有各种残疾的人使用设备。例如,视力障碍人士可以使用iOS的VoiceOver功能让设备朗读屏幕文本或提供的描述性文本,以帮助他们理解UI组件的目的和内容。用户可以触摸屏幕来听取VoiceOver朗读触摸附近屏幕上的内容。可以启用这些功能并配置应用的UI组件以实现可访问性。
4.6 国际化
由于iOS设备在全球范围内使用,为了让应用覆盖尽可能多的用户,应该考虑针对不同的地区和语言进行定制,这就是国际化。可以为欢迎应用的标签和图像视图的可访问性字符串提供西班牙语文本,然后在配置为西班牙语的模拟器中测试应用。
创建通用应用项目时,可以通过
File > New > Project…
创建新项目或
File > Open…
打开现有项目。选择
File > New > Project…
会显示一个包含模板的窗口,模板可以为常用应用设计提供预配置的起点。对于iOS应用,使用iOS类别下的
Application
子类别中的模板。
Swift编程:自定义操作符与iOS 8欢迎应用开发
5. 创建通用应用项目
创建通用应用项目可按以下步骤进行:
1.
选择项目创建方式
:可以通过
File > New > Project…
创建新项目,也可以使用
File > Open…
打开现有项目。当选择
File > New > Project…
时,会弹出一个包含各种模板的窗口,这些模板能为常用应用设计提供预配置的起点。
2.
选择iOS应用模板
:对于iOS应用,要使用iOS类别下的
Application
子类别中的模板。
以下是iOS应用模板的简要说明表格:
| 模板名称 | 简要说明 |
| ---- | ---- |
| 具体模板1 | 用于创建特定类型的iOS应用,如单视图应用等 |
| 具体模板2 | 可快速搭建具有特定功能的iOS应用基础框架 |
| … | … |
6. Xcode工作区窗口
Xcode工作区窗口包含多个重要区域,了解这些区域的功能有助于高效开发应用。
-
导航器区域
:用于浏览项目中的文件和资源,方便快速定位所需内容。
-
编辑器区域
:是编写代码、设计界面等操作的主要区域。
-
实用工具区域和检查器
:可用于查看和编辑各种属性和设置,例如UI组件的属性等。
-
调试区域
:在调试应用时,可显示调试信息和变量的值。
-
Xcode工具栏
:包含一些常用的操作按钮,如运行、停止、调试等。
-
项目导航器
:以树形结构展示项目的文件和文件夹结构。
-
键盘快捷键
:合理使用键盘快捷键可以提高开发效率。
以下是各区域功能的简单流程图:
graph LR
A[导航器区域] --> B[浏览文件和资源]
C[编辑器区域] --> D[编写代码和设计界面]
E[实用工具区域和检查器] --> F[查看和编辑属性]
G[调试区域] --> H[显示调试信息]
I[Xcode工具栏] --> J[执行常用操作]
K[项目导航器] --> L[展示项目结构]
M[键盘快捷键] --> N[提高开发效率]
7. 故事板设计欢迎应用的UI
使用故事板设计欢迎应用的UI,可按以下步骤操作:
1.
配置应用方向
:确保应用支持纵向和横向两种方向,以提供更好的用户体验。
2.
提供应用图标
:在应用设置中指定应用的图标,图标会根据设备和显示上下文以不同大小和分辨率显示。
3.
创建图像集
:为应用的图像创建图像集,方便管理不同分辨率的图像资源。
4.
添加图像视图
:使用Interface Builder将图像视图拖放到UI上,并配置其属性,如显示的图像等。
5.
添加和配置标签
:同样使用Interface Builder添加标签到UI,并设置其文本属性。
6.
使用自动布局
:利用iOS的自动布局功能,确保UI组件在不同设备和方向下都能保持合适的布局。
以下是故事板设计UI的操作步骤列表:
1. 打开Interface Builder,进入故事板编辑界面。
2. 在对象库中找到图像视图组件,拖放到UI设计区域。
3. 选中图像视图,在属性检查器中设置显示的图像。
4. 从对象库中拖放标签到UI设计区域。
5. 在属性检查器中编辑标签的文本内容。
6. 使用自动布局工具为图像视图和标签添加约束,确保布局合理。
8. 运行欢迎应用
构建好应用后,可按以下步骤运行:
1.
在iOS模拟器中测试
:选择合适的模拟器设备(如iPhone、iPad),点击运行按钮,应用将在模拟器中启动。可以测试应用在不同设备和方向下的显示效果。
2.
在设备上运行(仅付费iOS开发者计划成员)
:如果是付费iOS开发者计划成员,可以将应用部署到iOS设备上运行。需要进行设备的连接和配置,确保设备可用于开发和测试。
9. 提高应用的可访问性
为了使应用对视力障碍人士更具可访问性,可按以下步骤操作:
1. 为UI组件(如图像视图、标签等)指定字符串描述。这些描述将在用户使用iOS的VoiceOver功能时被朗读出来,帮助用户了解UI组件的内容和用途。
2. 使用模拟器的可访问性检查器确认可访问性文本是否正确设置。
10. 实现应用的国际化
为了让应用支持国际化,可按以下步骤操作:
1.
锁定UI进行翻译
:在进行翻译前,锁定UI布局,确保翻译过程中UI不会发生变化。
2.
导出字符串资源
:将应用中的字符串资源导出,以便进行翻译。
3.
翻译字符串资源
:将导出的字符串资源翻译成目标语言(如西班牙语)。
4.
导入翻译后的资源
:将翻译好的字符串资源导入到应用中。
5.
测试应用
:在配置为目标语言(如西班牙语)的模拟器中运行应用,检查字符串是否正确显示。
以下是实现国际化的操作流程图:
graph LR
A[锁定UI] --> B[导出字符串资源]
B --> C[翻译资源]
C --> D[导入翻译后的资源]
D --> E[在目标语言模拟器中测试]
通过以上步骤,就可以完成一个简单的iOS 8欢迎应用的开发,该应用不仅能在不同设备上运行,还具备良好的可访问性和国际化支持。
超级会员免费看

9万+

被折叠的 条评论
为什么被折叠?



