Swift语法初见
类型的声明:
let implicitInteger = 70let implicitDouble = 70.0let explicitDouble: Double = 70
注:如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。
数值转换:
let label = "The width is"let width = 94let widthLabel = label + String(width)
注:值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。
let apples = 3let oranges = 5let appleSummary = "I have \(apples) apples."let fruitSummary = "I have \(apples + oranges) pieces of fruit."
注:有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。
数组、字典的初始化和赋值
var emptyArray = NSMutableArray.init()var emptyArray1 = NSMutableArray()emptyArray[0] = "00000";emptyArray[1] = "11111";emptyArray.add("22222")var emptyDictionary = NSMutableDictionary()emptyDictionary["1"] = 67788emptyDictionary["2"] = "67788"emptyDictionary.setValue("sss", forKeyPath: "key")
控制流
let vegetable = "cucumber"switch vegetable {case "celery": let vegetableComment = "Add some raisins and make ants on a log."case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich."case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?"default: let vegetableComment = "Everything tastes good in soup."}
注:支持任意类型比较;支持多个条件匹配;不需要break,因为只运行一个case; 除非case覆盖所有可能,否则default不可缺失
let interestingNumbers:NSDictionary = ["Prime": [2, 3, 5],"Fibonacci": [1, 1, 8],"Fibonacc": [1, 1, 8]]for (a,b) in interestingNumbers{ print(a) print(b)}
输出:Fibonacci [1, 1, 8] Prime [2, 3, 5]
for c in interestingNumbers{ print(c) } 输出:(key: "Fibonacci", value: [1, 1, 8]) (key: "Prime", value: [2, 3, 5])
注:for in 遍历字典时,两个变量表示 key,value,一个变量表示 key-value键值对
for i in 0...1 { interestingNumbers.object(forKey: interestingNumbers.allKeys[i])}for i in 0..<2 { interestingNumbers.object(forKey: interestingNumbers.allKeys[i])}
函数和闭包
func greet(nameOut name:String,_ day:String) -> String{ return "Hello \(name), today is \(day)."}greet(nameOut:"sss","sss")
注:1,区分内部和外部参数名 2,返回值的方式
func greet1(names:Int...) -> (a:Int,b:String,c:String){ let a = names[0] let b = "ss" let c = "aaa" return (a,b,c)}greet1(names: 1,2,3)func makeIncrementer() -> ( (Int) -> Int ) { func addOne(number:Int) ->Int { return 1+number } return addOne}var increment = makeIncrementer()increment(7)
注:1,函数可作为返回值
func hasAnyMatches(list: [Int],condition:(Int)->Bool) -> Bool{ for item in list{ if condition(item){ return true } } return false}func lessThanTen(number:Int) -> Bool { return number < 10}var number = [20, 19, 7, 12]hasAnyMatches(list:number,condition:lessThanTen)
注:1,函数可作为参数
let numbers = [10,20,30]numbers.map({ (number: Int) -> Int in let result = 3 * number let aiia = "ssss" return result})let mappedNumbers = numbers.map { number in number/2}print (mappedNumbers)class Shape { var name = "aa" let numberOfSides = 0 init(name:String) { self.name = name } func simpleDescription(name:String) -> String { return "A shape with \(numberOfSides) sides." } func funcInFunc(name:String)->((Int) -> (Int)){ func addSelf(number:Int)->Int{ return 1+number } return addSelf; }}Shape(name:"bb")let p = Shape(name:"aa").funcInFunc(name:"sss")p(20)
注:1,函数可作为返回值
numbers.map({ (number:Int)->Int in var aa = number let num = number % 2 if(num == 1){ aa = 0 } print(aa) return aa;})class ShapeChild: Shape{ override func simpleDescription(name: String) -> String{ return "A shape with \(numberOfSides) sides." } var sideLength: Double = 0.0 var perimeter:Double{ get{ return 3.0 * sideLength } set{ sideLength = newValue/3.0 } } var per:Int = 0{ willSet{ print("newValue : \(newValue)") } didSet{ print("oldValue : \(oldValue)") } }}var triangle = ShapeChild(name:"bb")triangle.perimetertriangle.perimeter = 9.9triangle.sideLength = 4.0triangle.perimetertriangle.per = 1triangle.per = 2
注:1,重写父类方法 用 override关键字 2,属性可以有get set方法,oldValue、newValue是默认参数
枚举与结构体
enum Rank: Int { case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King func simpleDescription() -> String { switch self { case .Ace: return "ace" case .Jack: return "jack" case .Queen: return "queen" case .King: return "king" default: return String(self.rawValue) } }}let ace = Rank.Acelet aceRawValue = ace.rawValue
注:使用enum来创建一个枚举 rawValue为自动去取方法
var optionalSquare: Rank? = Rank.AceoptionalSquare = niloptionalSquare = Rank.Five
注:如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil
enum ServerResponse { case Result(String, String) case Error(String)}let success = ServerResponse.Result("6:00 am", "8:09 pm")let failure = ServerResponse.Error("Out of cheese.")switch success {case let .Result(sunrise, sunset): let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."case let .Error(error): let serverResponse = "Failure... \(error)"}
注:一个枚举成员的实例可以有实例值。相同枚举成员的实例可以有不同的值。创建实例的时候传入值即可。
实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的,而且你是在定义枚举的时候设置原始值。
protocol printSelf{ var selfStr:String{get} mutating func printSelf()}class desk:printSelf{ var selfStr: String = "a desk" func printSelf() { print(selfStr) }}struct phone:printSelf{ var selfStr: String = "a phone" func printSelf() { print(selfStr) }}desk()phone()
注:类、枚举和结构体都可以实现接口。其中类是引用类型,枚举和结构体是值类型
在值类型的实例方法中,也可以直接修改self属性值。 mutating关键字用来标记一个会修改结构体或枚举属性值的方法
泛型
func repeatFunc(item: T, times: Int) -> [T] { var result = [T]() for _ in 0...times { result.append(item) } return result}repeatFunc(item:"knock",times:4)