这篇文章是笔者对此篇文章的翻译:这里是原文
一、在swift中的变量和常量
+ 将事物声明称let是最好的,因为这可以让编译器进行优化,否则它将不会进行这些优化。
var totalTeam = swiftTeam + iOSTeam
totalTeam += 1
二、隐士和显示类型的比较
- 到目前为止,你没有隐士的为这些常量或变量设置类型,因为编译器已经能够有能力自动去推断它。
- 举例来说,因为你给 swiftTeam 设置为13,编译器知道13 是一个 Int 类型,所以它会自动为你将 swiftTeam 设置为 Int 类型。
- 然而,只要你想要你就能够显式的设置它的类型。尝试用下面这行代码来替换设置swiftTeam:。
let swiftTeam:Int = 13
- 你会怀疑是否你应该显示的来设置类型,或者让编译器自动的为你推测它的类型,我们相信最好尽可能让编译器推测类型,因为你将得到一个Swift的主要优点之一:简洁易读的代码。
- 因为这样,应该选择推断类型的代码:
let swiftTeam = 13
三、Swift中的基础类型和控制流
- 到目前为止,你已经看了Int的例子,这是Swift类型应用于整数值,但是会有更多的例子。
- Float and Doubles:
有两种类型的小数点类型:FLoat和Double,Double有更多的精度,它会作为默认的小数点推断值,这意味着priceInferred也是一个Double值。
let priceInferred = 19.99
let priceExplicit:Double = 19.99
- Bool:
记住在 Swift 中你应该为 bool 值使用 true/false 而不像在 Objective-C 中使用 YES/NO
let onSaleInferred = true
let onSaleExplicit:Bool = false
- Strings
Strings是如你所期盼的,不再像Objective-C中使用@了,
let nameInferred = "Whoopie Cushion"
let nameExplicit:String = "Whoopie Cushion"
- if语句和字符串插值
if onSaleInferred{
print("\(nameInferred) on sale for \(priceInferred)!")
}else{
print("\(nameInferred) at regular price: \(priceInferred)!")
}
- 这是一个关于 if 语句的例子,如你在其他语言中所期待的,条件外的括号是可选的,大括号是必须的。
- 这个例子也展示了一个叫字符串插值的新技术。当你想要在 Swift 中用 string 替换一些东西的时候,只需要使用这个语法糖就可以了:***\(your expression)***
四、类和方法
- 你将创建一个小费计算类将帮你算出在一个饭店中花费的小费。
- 为了创建一个类,简单的输入 class 键和你所创建类的命名。然后为你的类输入一个 大括号
- 如果你继承自其他的类,你应该设置以个:然后跟上你父类的名称。注意你不必继承任何类(Objective-C 中你必须设置继承于 NSObject)
1、第一步:声明类
class TipCalculator {
}
- 这就是如何为一个类创建属性,对于变量和常量创建是一样的。这里创建了三个常量。
- 注意:任何你声明的属性当你声明它们的时候必须设置一个初始化的值,或者在你的初始化方法中- 这就是为什么现在会报错的原因。*如果你不想给你的属性一个初始化的值,你需要将他们声明称可选的值。*
2、第二步:声明属性
class TipCalculator {
let total:Double
let taxPct:Double
let subtotal:Double
}
- 这为类创建了一个带两个参数的额初始化器。初始化器在 Swift 中经常被命名位init - 如果你需要的话你能够创建不止一个,但是需要注意的是它们必须携带不同的参数。
- ***注意:你已经给方法的参数和类的属性一样的名称,正因为如此,我们需要用属性自身的前缀做出两个之间的区分。***
- 注意没有属性命名上的冲突,你不必添加自身的关键词,因为编译器能够自动推断出来。
3、为类添加方法
class TipCalculator {
let total:Double = 0.0
let taxPct:Double = 0.0
let subtotal:Double = 0.0
init(total:Double ,taxPct:Double){
self.total = total
self.taxPct = taxPct
subtotal = total/(taxPct + 1)
}
}
- 为了声明一个方法,需要用 *func* 关键词。之后添加参数(必须显示的声明类型)标示符,最后列举返回值类型。
4、为类添加方法
class TipCalculator {
let total:Double = 0.0
let taxPct:Double = 0.0
let subtotal:Double = 0.0
init(total:Double ,taxPct:Double){
self.total = total
self.taxPct = taxPct
subtotal = total/(taxPct + 1)
}
func calcTipWithTipPct(tipPct:Double) ->Double {
return subtotal * tipPct
}
}
- 这是一个新的去打印三个值的方法
- 注意:当你调用一个实例的方法的时候,第一个参数没用必要命名(但是其余的参数必须命名)。
- 注意:字符串插入是不被限制于打印变量的。你可以拥有各种类型复杂的方法调用和正确操作只要你喜欢。
class TipCalculator {
let total:Double
let taxPct:Double
let subtotal:Double
init(total:Double ,taxPct:Double){
self.total = total
self.taxPct = taxPct
subtotal = total/(taxPct + 1)
}
func calcTipWithTipPct(tipPct:Double) ->Double {
return subtotal * tipPct
}
func printPossibleTips() {
print("15%: \(calcTipWithTipPct(0.15))")
print("18%: \(calcTipWithTipPct(0.18))")
print("20%: \(calcTipWithTipPct(0.20))")
}
}
- 数组和 for 循环
class TipCalculator {
let total:Double
let taxPct:Double
let subtotal:Double
init(total:Double ,taxPct:Double){
self.total = total
self.taxPct = taxPct
subtotal = total/(taxPct + 1)
}
func calcTipWithTipPct(tipPct:Double) ->Double {
return subtotal * tipPct
}
func printPossibleTips() {
let possibleTipsInferred = [0.15,0.18,0.20]
let possibleTipsExplicit:[Double] = [0.15,0.18,0.20]
// for possibleTip in possibleTipsInferred{
// print("\(possibleTip*100)%:\(calcTipWithTipPct(possibleTip))")
// }
for i in 0..<possibleTipsInferred.count {
let possibleTip = possibleTipsInferred[i]
print("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}
}
}
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()
- 字典
- 对这个类做一个长远你的改动。你最好返回一个字典,而非是简单的打印,这将使展示结果变得简单。
func returnPossibleTips() -> [Int:Double]{
//1
let possibleTipsInferred = [0.15,0.18,0.20]
//2
var retval = [Int:Double]()
for possibleTip in possibleTipsInferred {
let intPct = Int(possibleTip*100)
//3
retval[intPct] = calcTipWithTipPct(possibleTip)
}
return retval
}
- 最终代码
// 1
class TipCalculator {
// 2
let total: Double
let taxPct: Double
let subtotal: Double
// 3
init(total: Double, taxPct: Double) {
self.total = total
self.taxPct = taxPct
subtotal = total / (taxPct + 1)
}
// 4
func calcTipWithTipPct(tipPct: Double) -> Double {
return subtotal * tipPct
}
// 1
func returnPossibleTips() -> [Int: Double] {
let possibleTipsInferred = [0.15, 0.18, 0.20]
// 2
var retval = [Int: Double]()
for possibleTip in possibleTipsInferred {
let intPct = Int(possibleTip*100)
// 3
retval[intPct] = calcTipWithTipPct(possibleTip)
}
return retval
}
}
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.returnPossibleTips()