项目作者: KittenYang

项目描述 :
学习Swift过程中自己出的一些Q&A,方便巩固知识点。Swift learning Q&A.
高级语言: Swift
项目地址: git://github.com/KittenYang/SwiftQ-A.git
创建时间: 2015-03-31T16:14:02Z
项目社区:https://github.com/KittenYang/SwiftQ-A

开源协议:

下载


SwiftQ-A

学习Swift过程中自己出的一些Q&A问答题,方便巩固知识点。Swift learning Q&A.

简单值

1)声明变量、声明常量(以及如何声明类型)

  1. var str = "Hello, playground"
  2. let num = 22
  3. let : Double = 44.0

2)简单值会隐式转换成其他类型吗?如果不是,该如何显示转换吗?

  1. 不会。
  2. hello = String(99)

3)其他值转换成‘字符串’有什么更简单的方法?

  1. let apples = "I have \(apples) apples."

4)直接创建数组、字典;如果访问?创建空数组、空字典(如果类型可以直接推断出来);

  1. var shoppingList = ["fishes","potatoes","eggs","juice"]
  2. var dic = [
  3. "ONE":"one",
  4. "TWO":"two",
  5. "THREE":"three",
  6. "FOUR":"four",
  7. "APP":"application",
  8. ]
  9. shoppingList[2] = "banana"
  10. dic["APP"] = "apples"
  11. var stringArray = [String]()
  12. var stringDic = [String : String]()
  13. var stringArraySimple = []
  14. var stringDicSimple = [:]

控制流

1)有哪五种?分别的语法

  1. 使用ifswitch来进行条件操作,使用for-inforwhiledo-while来进行循环。

2)if语句中,if score {….} 这样的代码可以吗?

  1. 不可以。if语句中条件表达式必须是一个布尔表达式,score不会隐式地与0做比较。

3)如何用if let处理值缺失的情况?

  1. 在类型后面加一个问号来标记这个变量的值是可选的。
  2. var optionalName : String? = "KITTEN"
  3. var greeting = "It's my greeting!"
  4. if let name = optionalName{
  5. greeting = "Hello,\(name)"
  6. }
  7. //如果optionalName的值为nil,那么if的条件判断为false,代码块中代码的不会执行。如果不是nil,则会把值赋给let后面的常量,这样代码块中可以使用这个值了。

4)如何使用switch?需要加上break吗?

  1. let vegetable = "red pepper"
  2. switch vegetable {
  3. case "celery":
  4. let vegetableComment = "Add some raisins and make ants on a log."
  5. case "cucumber", "watercress":
  6. let vegetableComment = "That would make a good tea sandwich."
  7. case let x where x.hasSuffix("pepper"):
  8. let vegetableComment = "Is it a spicy \(x)?"
  9. default:
  10. let vegetableComment = "Everything tastes good in soup."
  11. }
  12. 不需要使用break,因为switch匹配到子句之后就会退出switch,不会继续往下运行。

5)用for-in语句遍历字典?

  1. let forinDic = [
  2. "ONE":[1,2,3,4,5],
  3. "TWO":[11,22,33,44,55],
  4. "THREE":[111,222,333,444,555],
  5. "Four":[1111,2222,3333,4444,5555],
  6. "Five":[11111,22222,33333,44444,55555],
  7. ]
  8. var largest = 333
  9. for (kinds,numbers) in forinDic{
  10. for number in numbers{
  11. if number > largest && number < 44444{
  12. largest = number
  13. }
  14. }
  15. }

6)使用while、do-while

  1. while n < 100 {
  2. n *= 2
  3. }
  4. do{
  5. m *= 2
  6. }while(m < 100)

7)swift中一种特殊的表示取值范围的方法

  1. for var i = 0 ;i < 4; i++
  2. for i in 0..<4 // 0..<4表示不包含上边界。如果要包含上边界:0...4

函数和闭包

1)如何声明函数?如何调用函数?如何指定函数的返回值?

  1. func greet(name:String,day:String)->String{
  2. return "Hello,\(name),today is \(day)"
  3. }
  4. greet("KITTEN", "4月1号")

2)多个返回值的函数

func getMinMaxSum(scores:[Int])->(MIN:Int,MAX:Int,SUM:Int){

  1. var min = scores[0]
  2. var max = scores[0]
  3. var sum = 0
  4. for score in scores{
  5. if score > max{
  6. max = score
  7. }else if score < min{
  8. min = score
  9. }
  10. sum += score
  11. }
  12. return (min,max,sum)

}

let statistics = getMinMaxSum([5,3,10,3,9])

statistics.SUM

statistics.2 //可以用“.返回值” 或者 “.数组下标”的形式获得其中某个返回值

3)带可变个数的参数的函数

//用可变个数的参数的函数实现计算平均值的函数,要求输入的参数数目随机

func averageOf(numbers:Int…)->Int{

  1. var sum = 0
  2. for number in numbers{
  3. sum += number
  4. }
  5. return sum/numbers.count

}

averageOf(1,2,3,4,5)

4)如何使用嵌套函数?

  1. func returnFifteen()->Int{
  2. var y = 18
  3. func add(){
  4. y+=5
  5. }
  6. add()
  7. return y
  8. }
  9. returnFifteen()

5)函数怎么作为另一个函数的返回值?

  1. func twoFuncs()->(Void ->Int){
  2. func oneFun()->Int{
  3. return 5
  4. }
  5. return oneFun
  6. }
  7. var test = twoFuncs()
  8. test()

6)函数如何作为参数传入另一个函数

  1. func hasAnyMatches(list:[Int],condition:Int->Bool)->Bool{
  2. for item in list{
  3. if condition(item){
  4. return true
  5. }
  6. }
  7. return false
  8. }
  9. func lessThanTen(number:Int)->Bool{
  10. return number < 10
  11. }
  12. var numbers = [20,19,7,12]
  13. hasAnyMatches(numbers, lessThanTen)

7)用 ‘{}’ 创建一个匿名闭包

  1. var blockNumbers = [80,10,20,100]
  2. blockNumbers.map {
  3. (number:Int) -> Int in
  4. let result = 3 * number
  5. return result
  6. }

8)创建一个类型已知的闭包

  1. var MappedNumbers = [10,20,30,40]
  2. let mappedNumbers = MappedNumbers.map({ number in 3 * number })
  3. mappedNumbers

9)当一个闭包作为最后一个参数的时候可以怎么写?

  1. var SortedNumbers = [40,50,60,70]
  2. let sortedNumbers = sorted(SortedNumbers) { $0 > $1 }
  3. sortedNumbers //通过参数位置引用参数
  4. //当一个闭包作为最后一个参数传给一个函数的时候,可以直接跟在括号后面

对象和类

1)如何创建一个类

  1. class Shape{
  2. var numberOfSides = 0
  3. func simpleDescription()->String{
  4. return "A Shape with \(numberOfSides) sides"
  5. }
  6. }

2)创建一个类的实例

  1. var shape = Shape()
  2. shape.numberOfSides = 7
  3. var shapeDes = shape.simpleDescription()

3)类里面的构造函数、析构函数

  1. class NamedShape{
  2. var numberOfSides : Int = 0
  3. var name : String
  4. init(name:String){
  5. self.name = name
  6. }
  7. deinit{
  8. }
  9. func simpleDescription()->String{
  10. return "A shape with \(numberOfSides) sides,is \(name)"
  11. }
  12. }
  13. var tesss = NamedShape(name: "八边形")
  14. tesss.simpleDescription()

4)子类的定义

  1. class Circle: NamedShape {
  2. var radius: Double
  3. init(r: Double,na:String){
  4. self.radius = r
  5. super.init(name: na)
  6. self.name = "ss"
  7. //在使用父类的变量之前,必须先call super.init
  8. //在之类init方法返回之前,必须call super.init
  9. }
  10. func area()->Double{
  11. return self.radius * self.radius * M_PI
  12. }
  13. override func simpleDescription() -> String {
  14. return "这是重载的圆形"
  15. }
  16. }
  17. var circle = Circle(r:4,na:"yuanxin")
  18. circle.area()
  19. circle.simpleDescription()

5)使用getter/setter

  1. class Triangle: NamedShape{
  2. var sideLength: Double = 0.0
  3. init(sideLength:Double, name:String){
  4. self.sideLength = sideLength
  5. super.init(name: name)
  6. numberOfSides = 3
  7. }
  8. var perimeter: Double{
  9. get{
  10. return 3*self.sideLength
  11. }
  12. set{
  13. self.sideLength = newValue/3.0
  14. //newValue 是系统规定的固定名词
  15. }
  16. }
  17. override func simpleDescription() -> String {
  18. return "\(sideLength)"
  19. }
  20. }
  21. var tri = Triangle(sideLength: 3.1, name: "三角形")
  22. tri.perimeter
  23. tri.perimeter = 9.9
  24. tri.sideLength

6)什么情况下需要使用willSet/didSet?如何使用?

  1. 当不需要计算属性的时候,但仍然需要在设置一个新值之前或之后需要的代码可以写在willSet/didSet里。
  2. 如:确保三角形的边长总是和正方形的变长相同
  3. class TriAndSqu{
  4. var tri :Triangle{
  5. willSet{
  6. circle.radius = newValue.sideLength
  7. }
  8. }
  9. var circle: Circle{
  10. willSet{
  11. tri.sideLength = newValue.radius
  12. }
  13. }
  14. init(size: Double,name: String){
  15. circle = Circle(r: size, na: "圆形")
  16. tri = Triangle(sideLength: size, name: "三角形")
  17. }
  18. }
  19. var triandsqu = TriAndSqu(size: 10, name: "test shape")
  20. triandsqu.tri.sideLength
  21. triandsqu.circle.radius

7)什么是方法?什么是函数?它们的区别?

  1. 类中的func叫方法,类外的func叫函数。
  2. class Counter{
  3. var count: Int = 0
  4. func incrementBy(amount: Int,numberOfTimes: Int){
  5. count += amount * numberOfTimes
  6. }
  7. }
  8. var counter = Counter()
  9. counter.incrementBy(2, numberOfTimes: 7)
  10. //方法的参数名需要显式说明一下(第一个参数不用),比如上面的numberOfTimes。而函数的参数都不用显式说明。