Swift 语法小结

前端之家收集整理的这篇文章主要介绍了Swift 语法小结前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift 1. Optional 就是枚举 An Optional is just an enum enum Optional<T>{ case None case Some(T) } 2.Array的声明 var a=Array<String>() var a=[String]() let a=[“A”,”B”,”C”]不可改 let b=a[3] 遍历Array可使用for in for array in a{ println(“\(array)”) } 3.Dictionary var dic=Dictionary<String,Int>() var dic=[String:Int]() dic=[“title1”:1,”title2”:2] 访问一个dictionary的值将返回Optional let value=dic[“title3”] 返回nil 使用tuple遍历Dictionary for (key,value) in dic { println(“\(key)=\(value)”) } 4.结构体Range 一个起点,一个终点,称之为合理类型,Range是范型 struct Range<T>{ var startIndex:T var endIndex:T } a.在Array中Range中的类型是Int型,因为Array是通过Int索引 Range<Int> b.String中时String的索引 Range<String.Index> c.声明 let array=[“a”,”b”,”c”,”d”] let subArray1=array[2...3] ([“c”,”d”]) 闭区间 let subArray2=array[2..<3] ([“c”]) 左闭右开区间 遍历 for i in [27…104]{ println(“i=\(i)”) } 5.NSObject(swift中所有的类都可以继承NSObject) Objective-C中所有类的基类,比如UIViewController 6.NSNumber 装数字的类 let n=NSNumber(double:35.5) 将会以自身的值转为int或double let intversion=n.intValue / n.doubleVaule /n.boolValue 7.NSDate 存储日期,也可以获取当前日期和时间 Calendar,DateFormatter,DateComponents 8.NSData 比特包 传递无类型数据,原始数据 9.数据结构 类,枚举,结构 相同点:a.声明类似 b.可以有自己的属性方法 c.都可以有自己的函数 不同点:a.Enum本身是不能存储任何值的,可以将值存储在枚举的关联信息中 b.枚举可以有计算型属性 c.结构体和类可以初始化 d.类有继承的性质,类型和转化都属于类的性质 e.枚举和结构体是 值传递,类是 引用传递 10.override 重写父类方法的关键字 final 可以将一个方法标为final,表示这个方法不能被重写 11.类和实例都有自己的方法属性 var d:Double = -10 if d.isSignMinus {//isSignMinus是否是一个负数 d=Double.abs(d) //取绝对值 } isSignMinus是实例d的变量或者说是d的属性 abs是Double类的方法(所有对象共享),向该方法中传入需要操作的Double类型的实例 类方法 static func abs(d:Double) -> Double 12.参数名 所有方法所有的参数都有一个内部名和外部名 内部名:在方法中拥有一个本地变量的名字,方法中冒号之前的 外部名:调用者准备使用的,调用方法是在冒号之前的 a.使用外部名 func foo(extenal internal:Int){ let local=internal } func bar(){ let result=foo(external: 123) } b.不使用外部名 _表示会被忽略,所有方法默认是采用该方式 //func foo(internal:Int) func foo(_ internal:Int){ let local=internal } func bar(){ let result=foo(123) } c.强制使用内部名 # func foo(#internal:Int){ let local=internal } func bar(){ let result=foo(internal:123) } d.非第一个参数推荐使用内部名和外部名,当然,你可以使用_忽略外表名,但这不是标准的做法 func foo(first:Int,externalSencond second:Double){ let local=second } func bar(){ let result=foo(123,externalSencond:5.5) } 13.Property Observers(属性观察) var someStoredProperty:Int = 42{ willSet{newValue}//属性设置前被调用 didSet{oldValue}//属性设置后被调用,可以用来对用户界面进行更新 } override var someStoredProperty{ willSet{newValue} didSet{oldValue} } 使用场景:a.在自己的类中需存储属性,当其他方法设置它的值时,获得一个通知 b.当继承了某些类,你并不需要对这些类中的属性做什么修改,但当它们改变时你想知道 14.lazy 只有用到的时候才会被初始化 a.如果使用了很多资源,用lazy是不错的选择 lazy var brain=CalculatorBrain() b.初始化的时候在后面放一个大括号,也就是通过执行这个闭包来初始化这个属性,但这个闭包直有在property被用到的时候才会执行 lazy var someProperty:Type={ return <the constructed vaule> }() c.可以使用一个方法来进行初始化,只有标记为lazy才可以这样用,因为在类初始化之前,类中的方法都是不可以被调用的 lazy var myProperty=self.initializeMyProperty() 15.initialization 初始化 a.无父类的类,默认有一个init()方法 b.如果一个结构体没有初始化,它将默认得到一个将所有属性作为参数的初始化方法,不需要实现 struct MyStruct{ var x: Int=42 var y: String=“moltuae” init(x:Int,y:String) } c.在初始化方法里面可以设置任何属性的值,包括常量和变量 d.在类或结构体中可以调用自己的init方法 self.init(),类中可以调用父类的初始化方法 super.init() 16.在swift中提供两种构造器来初始化, Convenience Init 和 Designated Init(默认) I.(指定构造器)Designated Init a.必须在自己的init方法调用父类的init方法 b.前面父类不能有Convenience c.在调用父类的init方法前,必须初始化自己的所有属性,必须调用父类的初始化方法,然后才能给父类属性赋值 II.(便捷构造器)Convenience Init a.Convenience Init只能调用本类的Designated Init,不能调用任何父类的初始化方法 b.它能通过调用其他的Convenience Init间接调用Designated Init ,最后必须调用一个Designated Init c.必须直接或间接调用Designated Init,然后才能访问其他的值 III.其他构造器,类必须被初始化,才能调用方法属性 17.继承规则 a.如果类中没有实现任何的Designated Init,那么你将继承父类中的所有Designated Init,否则你将不继承任何一个父类中的Designated Init,也就是要么就不继承一个,要么就继承所有的,对于Convenience Init 也是一样的 b.如果你覆盖了你父类中的所有的Designated Init,重写了所有的这些Designated Init方法,那么你就继承来父类中所有的Convenience Init c.如果没有实现任何一个初始化方法,你将继承所有的Designated Init和Convenience Init 18.required 初始化 在init方法前面写上required,表示该方法子类必须实现这个方法 19.failable 初始化 有一些初始化允许失败并返回nil (optional) eg:init?(arg1:Type1,..){ might return nil in heres } 20.其他 a.UIImage 返回一个图片 optional let image=UIImage(named:”foo”) 通过名称获取图片 通常写法 if let image=UIImage(named:”foo”){ //image was successfully created }else{ //couldn’t create the image } b.let button=UIButton.buttonWithType(UIButtonType.System) join 返回一个由给定的分隔符分离出来的序列的元素。eg:join(":",["A","B","C"]) == "A:B:C" 那么 let separatedArrayElements:String =“,”.join(mArray)返回以逗号分割的字符串 这种写法是表示String有join()属性? 21.AnyObject 主要是用来兼容Objective-C API 和IOS a.Swift是强类型语言,并有类型推断的特性,所以不推荐使用AnyObject来声明对象 b.AnyObject:指向一个未知对象的指针,也就是一个类的实例 c.使用场景 作为属性,eg: var destinationViewController:AnyObject var toolbarItems:[AnyObject] 作为方法参数,eg func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject) 作为返回值 class fun buttonWithType(buttonType:UIButtonType) -> AnyObject d.不能发任何消息,可通过 as 进行强转,eg: let calcul=destinationViewController as CalculatorViewController 在不确定类型的情况下,可用 as? 返回一个Optional的值,eg: if let calcul=destinationViewController as? CalculatorViewController{..} 使用 is 判断类型 if destinationViewController is CalculatorViewController{..} c.AnyObject数组遍历,转换整个数组,不能使用 as? ,数组返回nil是没有意义的 for toolbarItem in toolbarItems as [UIBarButtonItem]{..} d.let title=(button as UIButton).currentTitle e.类型转换 可以对任何对象进行类型转换,转换的两个对象必须在同一条继承链上,向下转换 22.Array Array<T>方法 a.+=[T]添加数组 b.first -> T? optional 返回Array的第一个元素 c.last -> T? optional 返回Array的最后一个元素 d.append(T) 添加元素 e.insert(T,atIndex:Int) 插入元素 f.splice(Array<T>,atIndex:Int) 将另一个Array添加到当前Array的指定位置 g.removeAtIndex(Int) 移除指定元素 h.removeRange(Range) 移除指定范围元素 m.replaceRange(Range,[T]) 替换一个范围的元素,替换元素的个数不需要等于被替换元素的个数,也就是可使Array变长 l.sort(isOrderedBefore:(T,T) -> Bool) 排序,eg:a.sort{$0<$1} n.filter(includeElement:(T) -> Bool) -> [T] 将不需要的元素过滤掉,然后返回过滤后的数组,函数返回值Bool表示是否需要包含该元素 p.map(transform:(T) -> U) -> [U]) 映射,将原来的数组中的每一个元素映射到一个新的数组 e.g.: 将整型数组映射到字符串数组 let stringified:[String] =[1,2,3].map{“\($0)”} g.reduce(initial:U(初始值),combine: (U,T) -> U) -> U 将整个数组减少为一个值 e.g.: 将整个数组相加 let sum:Int =[1,3].reduce(0){ $0+$1 } 23.String.Index a.advance(String.Index,Int) eg: var s=“Hello” 第一个“l”出现的index var s="Hello" let index=advance(s.startIndex,2) //index is a String.Index to the 3rd glyph,”l” s.splice("abc",atIndex: index) //s=“Heabcllo” 从指定位置插入字符串 let mIndex=advance(s.startIndex,1) let endIndex=advance(s.startIndex,6) let subString=s[index..<endIndex] //subString=“abcl” b.rangeOfString 返回一个Optional Range<String.Index> e.g.:let num=“56.25” if let decimalRange = num.rangeOfString(“.”){//找到小数点 //decimalRange 是Range<String.Index> let wholeNumberPart=num[num.startIndex..<decimalRange.startIndex] } c.removeRange 移除指定范围的字符 s.removeRange([s.startIndex..<decimalRange.startIndex]) d.repalaceRange(Range,String) 将某一范围的字符替换成指定字符 e.description -> String endIndex -> String.Index hasPrefix(String) -> Bool hasSuffix(String) -> Bool toInt() -> Int? 没有To Double() capitalizedString -> String lowercaseString -> String uppercaseString -> String f.使用指定字符合并字符串数组 join(Array) -> String e.g:”,”.join([“1”,”2”,”3”])=“1,3” g.以指定字符分割字符串为字符串数组 componentsSparatedByString(String) -> [String] eg:“1,3”. componentsSparatedByString(“,”)=[“1”,”3”] 24.基本类型转换 let d:Double=37.5 let f:Float=37.5 let x=Int(d) let xd=Double(x) let cgf=CGFloat(d) 一种浮点数 let a=Array(“abc”) //a=[“a”,”c”] let s=String([“a”,”c”]) //s=“abc” 25.Assertions assert(() -> Bool,”message”) e.g.:assert(validation()!=nil,”the validation function returned nil”) 26.其他方法 let count=countElements(aCollection) 集合元素的个数 let sub=dropFirst(aSliceable) let sub=dropFirst(aSliceable) let first=first(aCollection) 集合的第一个元素 let last= last(aCollection) 集合的最后一个元素 let prefix= prefix(aSliceable,X:Int) let suffix=suffix(aSliceable,X:Int) let reversed:Array=reverse(aCollection) let backwardsString=String(reverse(s)) 27.数据类型的转变 a.NString - String NArray -Array<AnyObject> NSDictionary - Dictionary<NSObject,AnyObject> NSNumber - Int,Float,Double,Bool b.数据强转 let length=(aString as NSString).length //.length是NSString中的方法,String没有 (anArray as NSArray).componentsJoinedByString(NSString)//componentsJoinedByString是NSArray中的方法 28.NSUserDefaults 小型数据库,它只会存储Property List,当App关闭时,它可以永久保存这些数据,可以自动保存 a.可以像字典一样存储以及导出Property List,其本身就是一个字典 b.方法 setObject(AnyObject,forKey:String) //AnyObject必须是Property List objectForKey(String) -> AnyObject? arrayForKey(String) -> Array<AnyObject>? setDouble(Double,forkey:String) doubleForKey(String) -> Double //如果找不到则返回0 c.声明 let defaults=NSUserDefaults.standardUserDefaults() 使用:let plist:AnyObject=defaults.objectForKey(String) defaults.setObject(AnyObject,forKey:String) e.synchronize() 强制保存数据到磁盘,当App不在前端或处于调试阶段时 是无法自动保存的,这时候就要使用synchronize e.g.:if !defaults.synchronize(){..} 磁盘不能写入或磁盘已满 29.手动创建View a.Controller中有个顶层View var view:UIView addSubview(aView:UIView) removeFromSuperview() b.UIView 中有两个初始化方法 init(frame:CGRect) if the UIView is created in code init(coder:NSCoder) if the UIView comes out of a storyboard 手动创建初始化必须实现这两个方法 func setup(){..} override init(frame:CGRect){//a designed initializer super.init(frame:frame) setup() } required init(coder aDecoder:NSCoder){//a required initializer super.init(coder:aDecoder) setup() } c.awakeFromNib() 表示刚从Storyboard中被加载出来,可以做一些初始化操作 30.坐标系统数据结构 a.坐标的单位是CGFloat,CGFloat在Swift中是结构体 b.CGPont 坐标点,结构体 eg:var point=CGPoint(x:37.0,y:55.2) point.y -=30 point.x +=20.0 c.CGSize 矩形长和宽,结构体 e.g.:var size=CGSize(width:100.0,height:50.0) size.width +=42.5 size.height +=75 e.CGRect 由一个CGPoint和CGSize组合的结构体 struct CGRect{ var origin:CGPoint 左上角的点坐标 var size:CGSize } let rect = CGRect(origin:aCGPoint,size:ACGSize) 属性方法 var minX: CGFloat 矩形的左边界 var minY: CGFloat 矩形垂直方向上的中点 intersects(CGRect) -> Bool 两个矩形是否相交 intersect(CGRect) 创建一个更小的矩形,该矩形是两个矩形相交的部分 contains(CGPoint) -> Bool 是否在矩形中 31.控件坐标系统 a.一个点占多少个像素 var contentScaleFactor: CGFloat b.边界属性 var bounds:CGRect var center:CGPoint 自身视图矩形的中点,它是相对父视图的坐标系,而不是自身坐标系 var frame:CGRect 用来包含子视图的一个矩形,包含子视图的所有区域包括绘制部分,也是相对父视图的 一般来说,frame size和bounds size 完全相同,但视图View旋转的时候就不一定相同了 32.创建UIView a.let newView = UIView(frame:myViewFrame) let newView = UIView() //返回空视图CGRectZero,size和frame都是0 eg: let labelRect = CGRect(x: 20,y:20,width:100,height:50) let label=UILabel(frame: labelRect) label.text = “Hello” view.addSubview(label) //view是Controller中最顶层的视图 b.不要调用drawRect这个方法!!! *drawRect是给系统调用的,当视图需要重新绘制时,系统会自动调用drawRect setNeedsDisplay() setNeedsDisplayInRect(regionThatNeedsToBeRedrawn: CGRect) 指定某个特定的范围来重绘 c.Core Graphics 33.UIBezierPath 绘制线条,图形 a.绘制三角形 let path=UIBezierPath()创建 path.moveToPoint(CGPoint(80,50)) path.addLineToPoint(CGPoint(140,150)) path.addLineToPoint(CGPoint(10,150)) path.closePath() UIColor.greenColor().setFill() 内部填充颜色为绿色 UIColor.redColor().setStroke() 描边颜色为红色 path.linewidth=3.0 path.fill() path.stroke() b.其他 let roundRect = UIBezierPath(roundedRect: aCGRect,cornerRadius: aCGFloat) 绘制椭圆矩形 let oval = UIBezierPath(ovalInRect: aCGRect) 绘制圆或椭圆 addClip() 剪切任意的Path func containsPoint(CGPoint) -> Bool 碰撞检测 有usesEventOddFillRule属性 34.UIColor a.设置透明度 let green=UIColor.greenColor() let transparentYellow = UIColor.yellowColor().colorWidthAlPhaComponent(0.5) 设置颜色透明度 alpha取值0~1 0表示完全透明 b.View也可以设置透明度 (不推荐) var opaque=fasle 设置透明度前必须先设置opaque=false var alpha:CGFloat, c.View可以隐藏 var hidden:Bool 35.NSAttributedString 绘制文本 a.let text = NSAttributedString(“hello”) text.drawAtPoint(aCGPoint) let textSize: CGSize = text.size 绘制可变性文本: let mutableText=NSMutableAttributedString(“some string”) b.方法属性 func setAttributes(attributes: Dictionary,range: NSRange) func addAttributes(attributes: Dictionary,range: NSRange) NSForegroundColorAttributeName : UIColor 设置前景色 NSStrokeWidthAttributeName : CGFloat 设置描边的宽度 NSFontAttributeName : UIFont 设置字体的样式 36.Font a.使用推荐的字体 (static for struct,class for class type) class func preferredFontForTextStyle(UIFontTextStyle) -> UIFont UIFontTextStyle.Headline UIFontTextStyle.Body UIFontTextStyle.Fontnate b.系统字体 class func systemFontOfSize(pointSize: CGFloat) -> UIFont class func boldSystemFontOfSize(pointSize: CGFloat) -> UIFont 37.显示图片 a.UIImageView let image: UIImage? = UIImage(named: “foo”) 返回optional let image: UIImage? = UIImage(contentsOfFile: aString) let image: UIImage? = UIImage(data: anNSData) //raw jpg,png,tiff等 image.drawAtPoint(aCGPoint) 在左上角显示图片 image.drawInRect(aCGRect) 缩放图片让其适应这个View矩形 image.drawAsPatternInRect(aCGRect) 使图片填满整个区域 b.当View高宽改变时 View 中的属性 var contentMode: UIViewContentMode 让图片重新调整位置 mode:.Left/.Right/.Top/.Bottom/.TopRight/.TopLeft/.BottomRight/.BottomLeft/.Center 缩放:.ScaleToFill(默认)/.ScaleAspectFill/.ScaleAspectFit 重新绘制:.Redraw 38.a.在自定义控件中,class前声明@IBDesignableXcode会自动识别这是一个IBDesignable类,可以让自定义控件的UI显示到视图板上,否则需运行的时候才能出现. b. 自定义控件的变量前配置 @IBInspectable设置自定义属性,可以在外部配置,如在storyboard 39.Extensions 给一个现存的类 结构或枚举添加方法属性,不需要修改代码 a.限制 I.不能通过extension添加一个已存在的方法属性,也就是不能替换 II.添加属性不能有存储,只能是运算属性 b.作用:用作软件构架的核心基础 40.Protocols 一种相对简便的表示API的方法,是一种数据类型 a.Protocols 本身是没有实现的,没有实现的数据类型,只是声明 b.使用Protocols来声明各种各样的属性方法 c.使用条件 I.声明protocol II.类,结构或枚举继承一个protocol必须实现它 III.必须实现protocol中所有的属性方法 e.eg: protocol SomeProtocol: InheritedProtocol1,InheritedProtocol2{ //必须定义一个属性是否有get方法或set方法 var someProperty:Int{get set} fun aMethod(arg1:Double,anotherArgument:String) -> SomeType // 任何可被改变的函数需要mutating关键字修饰 mutating func changeIt() init(arg:Type) } 某个类实现SomeProtocol时,也必须实现InheritedProtocol1,InheritedProtocol2,这两个也是Protocol,相当于SomeProtocol的父类。 f.protocol使用class修饰,说明该protocol只能被类实现,实例已引用被传递 e.g:protocol SomeProtocol: class,InheritedProtocol1,InheritedProtocol2{ ….. } g.protocol可以要求实现的类,结构或枚举去实现特定的初始化方法 h.实现 class SomeClass: SuperclassOfSomeClass,SomeProtocol,AnotherProtocol{ required init(..) //初始化必须使用required修饰 } enum SomeEnum:SomeProtocol,AnotherProtocol{…..} struct SomeEnum:SomeProtocol,AnotherProtocol{…..} 一旦声明了Protocol就必须实现,否则无法通过编译 还可以使用Extension来扩展属性方法 extension Something:SomeProtocol{..} n.使用 protocol Moveable{ mutating fun moveTo(p: CGPoint) } class Car:Moveable{ func moveTo(p:CGPoint){…} func changeOil() } struct Shape: Moveable{ mutating fun moveTo(p:CGPoint{…} fun draw() } let prius:Car= Car() let square: Shape = Shape() var thingToMove:Moveable=prius thingToMove.moveTo(..) thingToMove=square let thingsToMove:[Moveable]=[prius,square] func slide(slider:Movearble){ let positionToSlideTo=.. slider.moveTO(positionToSlideTo) } slide(prius) slide(square) //使用<>,表示x这个参数必须同时实现Slippery和Moveable协议 func slipAndSlide(x:protocol<Slippery,Moveable>) 41.Delegation

猜你在找的Swift相关文章