iOS程序猿必知的11个swift技巧
2016-12-16 22:07
423 查看
本文和大家分享的主要是swift开发中常用的11个小技巧,希望通过本文的分享能帮助大家更好的学习和使用swift。
1. 扩展(Extension)
任务: 求数字的平方。
// 菜鸟版
funcsquare(x: Int) -> Int { return x * x }var squaredOfFive = square(x: 5)
square(x: squaredOfFive) // 625
为了求5的四次方我们被迫创建变量 squaredOfFive — 高手可不喜欢被迫定义一个无用的变量。
// 高手版extension Int {
var squared: Int { return self * self }
}5.squared // 255.squared.squared // 625
2. 泛型(Generics)
任务:打印输出数组内所有的元素。
// 菜鸟版var stringArray = ["苍老师", "范老师", "优衣库"]var intArray = [1, 3, 4, 5, 6]var doubleArray = [1.0, 2.0, 3.0]
funcprintStringArray(a: [String]) {
for s in a {
print(s)
}
}
funcprintIntArray(a: [Int]) { for i in a { print(i) } }
funcprintDoubleArray(a: [Double]) {for d in a { print(d) } }
居然要定义这么多函数? 菜鸟能忍高手不能忍!!!
// 高手版funcprintElementFromArray(a: [T]) {
for element in a {
print(element)
}
}
3. For 遍历 vs While 遍历
任务:打印 5 次 陆家嘴
// 菜鸟版var i = 0while 5 > i {
print("陆家嘴")
i += 1
}
被迫定义了变量 i 来确保打印 陆家嘴 5 次。
注意定义越多的变量,越多的潜在风险,越多的生活问题。这就是蝴蝶效应,你难道想X生活不和谐?
// 高手版for _ in 1...5 {
print("陆家嘴")
}
上面的代码实在是简洁,美妙。
4. Gaurd let vs if let
任务 : 让我们写个欢迎新用户的程序。
var myUsername: Double?var myPassword: Double?// 菜鸟版
funcuserLogIn() {
if letusername = myUsername {
if letpassword = myPassword {
print("优衣库欢迎, \(username)"!)
}
}
}
这些令人讨厌的嵌套代码,我们要消灭它
// 高手版
funcuserLogIn() {
guardletusername = myUsername, letpassword = myPassword
else { return }
print("优衣库欢迎, \(username)!")
}
注意这里如果myUsername 或 myPassword nil,都会提前结束,否则就会打印 “优衣库欢迎, XXX”
5. 计算属性 vs 函数
任务:计算圆的直径
// 菜鸟版funcgetDiameter(radius: Double) -> Double { return radius * 2}funcgetRadius(diameter: Double) -> Double { return diameter /2}getDiameter(radius: 10) // return 20getRadius(diameter: 200) // return 100getRadius(diameter:
600) // return 300
上面我们创建了2个毫无关系的函数,可是直径和周长两者真的没有关系吗?
// 高手版var radius: Double = 10var diameter: Double {
get { return radius * 2}
set { radius = newValue / 2}
}
radius // 10
diameter // 20
diameter = 1000
radius // 500
现在半径和直径相互依赖,真实地反应了两者的关系。
记得上面说的蝴蝶效应吗? 越少的依赖,代码越简洁,问题越少,生活越美好!
6. 枚举 – 类型安全
任务:卖门票
// 菜鸟版switch "Adult" {
case "Adult": print("请付 50 元")
case "Child": print("请付 25 元")
case "Senior": print("请付 30 元")
default: print("你确认不是僵尸吗,哥们?")
}
“Adult”, “Child”, “Senior” 这里都是硬编码,你每次需要输入手动输入这些字符,记得我们上面讲到的吗? 手动键入越少,错误越少,生活越美好。
// 高手版enum People { case adult, child, senior }switch People.adult {
case .adult: print("请付 50 元")
case .child: print("请付 25 元")
case .senior: print("请付 30 元")
default: print("你确认不是僵尸吗,哥们?")
}
这样你就避免了不小心输入错误的问题,因为 “.adult”, “.child”, “.senior” 被定义成了enum’, 任何不在预定义范围内的实例都会被Xcode毫不留情的指出来,合理利用集成开发环境是高手必备的。
7. 空合运算符
任务: 用户选择微博主体颜色。
// 菜鸟版var userChosenColor: String? var defaultColor = "Red"var colorToUse = ""if letColor = userChosenColor {
colorToUse = Color
} else {
colorToUse = defaultColor
}
这也太臃肿了吧,让我们来减减肥。
// 高手版var colorToUse = userChosenColor ?? defaultColor
稍微解释一下, 如 userChosenColor 为 nil, 则选择 defaultColor, 否则则userChosenColor.
其实空合运算符是对以下代码的简短表达方法。
a != nil ? a! : b
8. 函数式编程
任务: 获取偶数。
// 菜鸟版
var newEvens = [Int]()
for i in 1...10 {
if i % 2 == 0 {
newEvens.append(i)
}
}
print(newEvens) // [2, 4, 6, 8, 10]
这种for循环真是冗长,让人看的昏昏欲睡。
// 高手版var evens = (1...10).filter { $0 % 2 == 0 } print(evens) // [2, 4, 6, 8, 10]
有没有感觉函数式编程让你看起来聪明多了。
9. 闭包 vs 函数
任务: 求两个数字的和。
// 菜鸟版
funcsum(x: Int, y: Int) -> Int {
return x + y
}var result = sum(x: 5, y: 6) // 11
为了这个功能我还需要记住函数名 和 变量名? 能不能少一个呢?
// 高手版var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
sumUsingClosure(5, 6) // 11
10. 属性观测器
任务:计算圆的直径
// 菜鸟版var radius = 10.0
funcgetDiameter(radius: Double) -> Double {
return radius * 2
}
getDiameter(radius: radius) // return 20
这里是不需要专门定义函数的。
// 高手版var diameter = 0var radius: Double = 10 {
willSet { print("准备赋值中") }
didSet { diameter =radius * 2}
}
}
radius = 10 // 准备赋值中
diameter // 20.0
willSet会在给变量radius赋值前调用,而 didSet 会在给变量radius赋值后调用。
11.便利初始化
任务: 一个人有多少根手指和脚趾
// 菜鸟版class Human {
var finger: Int
var toe: Int
init(finger: Int, toe: Int) {
self.finger = finger
self.toe = toe }
}
var daDi = Human(finger: 10, toe: 10)
daDi.finger // 10
daDi.toe // 10
因为绝大部分人都有十根手指和脚趾,可以初始化时预先赋值。
// 高手版class Human {
var finger: Int
var toe: Int
init(finger: Int, toe: Int) {
self.finger = finger
self.toe = toe
}
convenienceinit() {
self.init(finger: 10, toe: 10) // 调用主初始化方法
}
}
var daDi = Human()
daDi.finger // 10
daDi.toe // 10
Swift中可以在init初始化方法前加上convenience关键字,这类方法主要提供使用上的方便。
所有的convenience初始化方法都必须调用同一个类中的顶级初始化方法完成初始化。另外convenience的初始化方法是不能被子类重写或从子类中以super的方式被调用的。
来源:伯乐在线
1. 扩展(Extension)
任务: 求数字的平方。
// 菜鸟版
funcsquare(x: Int) -> Int { return x * x }var squaredOfFive = square(x: 5)
square(x: squaredOfFive) // 625
为了求5的四次方我们被迫创建变量 squaredOfFive — 高手可不喜欢被迫定义一个无用的变量。
// 高手版extension Int {
var squared: Int { return self * self }
}5.squared // 255.squared.squared // 625
2. 泛型(Generics)
任务:打印输出数组内所有的元素。
// 菜鸟版var stringArray = ["苍老师", "范老师", "优衣库"]var intArray = [1, 3, 4, 5, 6]var doubleArray = [1.0, 2.0, 3.0]
funcprintStringArray(a: [String]) {
for s in a {
print(s)
}
}
funcprintIntArray(a: [Int]) { for i in a { print(i) } }
funcprintDoubleArray(a: [Double]) {for d in a { print(d) } }
居然要定义这么多函数? 菜鸟能忍高手不能忍!!!
// 高手版funcprintElementFromArray(a: [T]) {
for element in a {
print(element)
}
}
3. For 遍历 vs While 遍历
任务:打印 5 次 陆家嘴
// 菜鸟版var i = 0while 5 > i {
print("陆家嘴")
i += 1
}
被迫定义了变量 i 来确保打印 陆家嘴 5 次。
注意定义越多的变量,越多的潜在风险,越多的生活问题。这就是蝴蝶效应,你难道想X生活不和谐?
// 高手版for _ in 1...5 {
print("陆家嘴")
}
上面的代码实在是简洁,美妙。
4. Gaurd let vs if let
任务 : 让我们写个欢迎新用户的程序。
var myUsername: Double?var myPassword: Double?// 菜鸟版
funcuserLogIn() {
if letusername = myUsername {
if letpassword = myPassword {
print("优衣库欢迎, \(username)"!)
}
}
}
这些令人讨厌的嵌套代码,我们要消灭它
// 高手版
funcuserLogIn() {
guardletusername = myUsername, letpassword = myPassword
else { return }
print("优衣库欢迎, \(username)!")
}
注意这里如果myUsername 或 myPassword nil,都会提前结束,否则就会打印 “优衣库欢迎, XXX”
5. 计算属性 vs 函数
任务:计算圆的直径
// 菜鸟版funcgetDiameter(radius: Double) -> Double { return radius * 2}funcgetRadius(diameter: Double) -> Double { return diameter /2}getDiameter(radius: 10) // return 20getRadius(diameter: 200) // return 100getRadius(diameter:
600) // return 300
上面我们创建了2个毫无关系的函数,可是直径和周长两者真的没有关系吗?
// 高手版var radius: Double = 10var diameter: Double {
get { return radius * 2}
set { radius = newValue / 2}
}
radius // 10
diameter // 20
diameter = 1000
radius // 500
现在半径和直径相互依赖,真实地反应了两者的关系。
记得上面说的蝴蝶效应吗? 越少的依赖,代码越简洁,问题越少,生活越美好!
6. 枚举 – 类型安全
任务:卖门票
// 菜鸟版switch "Adult" {
case "Adult": print("请付 50 元")
case "Child": print("请付 25 元")
case "Senior": print("请付 30 元")
default: print("你确认不是僵尸吗,哥们?")
}
“Adult”, “Child”, “Senior” 这里都是硬编码,你每次需要输入手动输入这些字符,记得我们上面讲到的吗? 手动键入越少,错误越少,生活越美好。
// 高手版enum People { case adult, child, senior }switch People.adult {
case .adult: print("请付 50 元")
case .child: print("请付 25 元")
case .senior: print("请付 30 元")
default: print("你确认不是僵尸吗,哥们?")
}
这样你就避免了不小心输入错误的问题,因为 “.adult”, “.child”, “.senior” 被定义成了enum’, 任何不在预定义范围内的实例都会被Xcode毫不留情的指出来,合理利用集成开发环境是高手必备的。
7. 空合运算符
任务: 用户选择微博主体颜色。
// 菜鸟版var userChosenColor: String? var defaultColor = "Red"var colorToUse = ""if letColor = userChosenColor {
colorToUse = Color
} else {
colorToUse = defaultColor
}
这也太臃肿了吧,让我们来减减肥。
// 高手版var colorToUse = userChosenColor ?? defaultColor
稍微解释一下, 如 userChosenColor 为 nil, 则选择 defaultColor, 否则则userChosenColor.
其实空合运算符是对以下代码的简短表达方法。
a != nil ? a! : b
8. 函数式编程
任务: 获取偶数。
// 菜鸟版
var newEvens = [Int]()
for i in 1...10 {
if i % 2 == 0 {
newEvens.append(i)
}
}
print(newEvens) // [2, 4, 6, 8, 10]
这种for循环真是冗长,让人看的昏昏欲睡。
// 高手版var evens = (1...10).filter { $0 % 2 == 0 } print(evens) // [2, 4, 6, 8, 10]
有没有感觉函数式编程让你看起来聪明多了。
9. 闭包 vs 函数
任务: 求两个数字的和。
// 菜鸟版
funcsum(x: Int, y: Int) -> Int {
return x + y
}var result = sum(x: 5, y: 6) // 11
为了这个功能我还需要记住函数名 和 变量名? 能不能少一个呢?
// 高手版var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
sumUsingClosure(5, 6) // 11
10. 属性观测器
任务:计算圆的直径
// 菜鸟版var radius = 10.0
funcgetDiameter(radius: Double) -> Double {
return radius * 2
}
getDiameter(radius: radius) // return 20
这里是不需要专门定义函数的。
// 高手版var diameter = 0var radius: Double = 10 {
willSet { print("准备赋值中") }
didSet { diameter =radius * 2}
}
}
radius = 10 // 准备赋值中
diameter // 20.0
willSet会在给变量radius赋值前调用,而 didSet 会在给变量radius赋值后调用。
11.便利初始化
任务: 一个人有多少根手指和脚趾
// 菜鸟版class Human {
var finger: Int
var toe: Int
init(finger: Int, toe: Int) {
self.finger = finger
self.toe = toe }
}
var daDi = Human(finger: 10, toe: 10)
daDi.finger // 10
daDi.toe // 10
因为绝大部分人都有十根手指和脚趾,可以初始化时预先赋值。
// 高手版class Human {
var finger: Int
var toe: Int
init(finger: Int, toe: Int) {
self.finger = finger
self.toe = toe
}
convenienceinit() {
self.init(finger: 10, toe: 10) // 调用主初始化方法
}
}
var daDi = Human()
daDi.finger // 10
daDi.toe // 10
Swift中可以在init初始化方法前加上convenience关键字,这类方法主要提供使用上的方便。
所有的convenience初始化方法都必须调用同一个类中的顶级初始化方法完成初始化。另外convenience的初始化方法是不能被子类重写或从子类中以super的方式被调用的。
来源:伯乐在线
相关文章推荐
- 盘点一些iOS开发技巧:Swift和Objective-C
- 使用 Swift 和 Objective-C 执行 iOS 内存管理的 7 个简单技巧
- 改良程序必知必会的11个经典技巧
- 程序猿必知的swift单例编写的正确方式
- 嵌入式程序猿必知的3个的C语言技巧
- iOS程序猿必知的位运算相关知识
- ios程序猿学习Swift 第一天 从Hello World开始
- iOS开发必知Swift结构体中实现写时复制的方法
- 奔五的人学iOS:swift对 状态栏、导航条若干技巧
- Java程序猿必知的10个调试技巧
- swift语言从天而降,作为ios程序猿,我们如果面对?
- iOS程序猿之OC项目引入Swift方法
- iOS开发技巧系列 使用Swift反射
- ios开发--在Swift中使用JavaScript的方法和技巧
- 改良程序需要的11个技巧
- 网上投递简历必知的几个技巧
- 网页布局CSS技巧-Web设计必知
- 软件工程师必知的12个单元测试技巧
- 改良程序需要的11个技巧
- Web设计师必须知道的11个SEO技巧