从入门到精通swift编程未小码哥课件源码瑞客1期day24oc_第1页
从入门到精通swift编程未小码哥课件源码瑞客1期day24oc_第2页
从入门到精通swift编程未小码哥课件源码瑞客1期day24oc_第3页
从入门到精通swift编程未小码哥课件源码瑞客1期day24oc_第4页
从入门到精通swift编程未小码哥课件源码瑞客1期day24oc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

@M了个 实力ITn//MARK:类似于OC中的#pragman//MARK:-类似于OC中的#pragmamarkn//TODO:n//FIXME:#ifos(macOS)||//CPU架构:i386\x86_64\arm\arm64#elseifarch(x86_64||arch(arm64)swift#elseifswift(<5)&&#elseif#elseifcanImport(Foundation)#if#if#ifdebug模式debug模式#ifDEBUGreleasefuncfunclog<T>(_msg:file:NSString=#file,line:Int=#line,fn:String=#function){#ifDEBUGletprefix= print(prefix,msg)}ifif#available(iOS10,macOS10.12,*)对于iOS平台,只在iOS10对于macOS平台,只在macOS10.12最后的*}@available@available(iOS10,macOS10.15,*) structStudent@available(*,unavailable,renamed:"study")funcstudy_(){}funcstudy()@available(iOS,deprecated:@available(macOS,deprecated:10.12)funcrun(){}} 用法参考:p编译器自动生 n也可以删掉@UIApplicationMain,自定 Swift调用n新建1个桥接头文件,文件名格式默认为:{targetName}-Bridging-n在{targetName}-Bridging-Header.h文件中#importOC需 给Swift的内#import#import intintsum(inta,int@interface:@property(nonatomic,assign)NSInteger@property(nonatomic,copy)NSString-(instancetype)initWithAge:(NSInteger)agename:(NSString+ WithAge:(NSInteger)agename:(NSString-+-(void)eat:(NSString*)foodother:(NSString+(void)eat:(NSString*)foodother:(NSString*)other;Swift调用OC– Swift调用OC– @implementation-(instancetype)initWithAge:(NSInteger)agename:(NSString*)name{if(self=[superinit]){self.age=age;=name;}return}+(instancetype) WithAge:(NSInteger)agename:(NSString*)name{return[[selfalloc]initWithAge:agename:name];}+(void)run{ +run");(void)run{NSLog(@"%zd%@-run",_age,_name);+(void)eat:(NSString*)foodother:(NSString*)other{ +eat%@%@",food,other);(void)eat:(NSString*)foodother:(NSString*)other{NSLog(@"%zd%@-eat%@%@",_age,_name,food,other);}intsum(inta,intb){returna+b;varvarp=MJ (age:10,name:"Jack")p.age=18="Rose"p.run()//18Rose-runp.eat("Apple",other:"Water")//18Rose-eatApple.run().eat("Pizza",other:"Banana")+eatPizzaprint(sum(10,20))//Swift调用OCSwiftvarvarp=MJ (age:10,name:"Jack")p.age=18="Rose"p.run()//18Rose-runp.eat("Apple",other:"Water")//18Rose-eatApple.run().eat("Pizza",other:"Banana")+eatPizzaprint(sum(10,20))//Swift调用OCSwiftSwift调用OCn如果C语 给Swift的函数名跟Swift中的其他函数 p可以在Swift中使用@_silgen_name修改CCintsum(inta,intb){returna+b;}////@_silgen_name("sum")funcswift_sum(_v1:Int32,_v2:Int32)->Int32print(swift_sum(10,20))//30print(sum(10,20))//nXcode已经默认生成一个用于OC调用Swift的头文件,文件名格式是:{targetName}-OC调用Swiftimport@objcMembersclassCar:NSObjectimport@objcMembersclassCar:NSObject{varprice:Doublevarband:init(price:Double,band:String){self.price=priceself.band=}funcrun(){print(price,band,"run")}staticfuncrun(){print("Carrun")}}extensionCarfunctest(){print(price,band,"test")}n使用@objc修饰需 n使用@objcMembersp代表默认所有成员都 给OC(包括扩展中定义的成员p最终是否成 ,还需要考虑成员自身 级OC调用SwifttargetName}-nXcode会根据Swift代码生成对应的 ,写入{targetName}-Swift.h文@interfaceCar:NSObject@property(nonatomic)doubleprice;@property(nonatomic,copy)NSString*_Nonnull(nonnullinstancetype)initWithPrice:(double)priceband:(NSString*_Nonnull)band+(nonnullinstancetype)init+(nonnullinstancetype)newSWIFT_UNAVAILABLE_MSG("-initisunavailable");@interfaceCar(SWIFT_EXTENSION(备课OC调用SwiftOC#import#import"备课_Swift-Swift.h"intsum(inta,intb){Car*c=[[Caralloc]initWithPrice:10.5band:@"BMW"];c.band=@"Bently";c.price=[crun];//108.5Bentlyrun[ctest];//108.5Bentlytest[Carrun];//Carrunreturna+}OC调用Swiftn可以通过@objc重命名 给OC的符号名(类名、属性名、函数名等MJCar*c=[[MJCar*c=[[MJCaralloc]initWithPrice:10.5band:@"BMW"];=@"Bently";c.price=[cdrive];//108.5Bently[cexec:10v2:20];//108.5Bentlytest[MJCarrun];//Carrun@objcMembersclassCar:NSObject{varprice:Doublevarband:init(price:Double,band:String){self.price=priceself.band=}funcrun(){print(price,band,"run")}staticfuncrun(){print("Carrun")}}extensionCar{functest(){print(price,band,"test")}@objcMembers@objcMembers:NSObjectfunctest1(v1:Int){print("test1")functest2(v1:Int,v2:Int){print("test2(v1:v2:)")functest2(_v1:Double,_v2:Double){print("test2(_:_:)")}funcrun(){perform(#selector(test2as(Double,Double)->Void))}}nSwift中依然可以使用选择器,使用#selector(name)p必须是被@objcMembers或@objcnSwift的字符串类型String,跟OC的NSString,在API//var//varemptyStr1=varemptyStr2=varstr="123456"print(str.hasPrefix("123"))//trueprint(str.hasSuffix("456"))//varstr:String=拼接,jack_rose//重载运算符+strstr"_3"//重载运算符str+=//\()str=长度,9,1_2_3_4_5varvarstr=//str.insert("_",at://str.insert(contentsOf:"3_4",at:////str.insert(contentsOf:"888",at:str.index(before:"666",at:str.index(after:// str.insert(contentsOf: o",at:str.index(str.startIndex,offsetBy://str.remove(at:str.firstIndex(of: str.removeAll{$0=="6"}varrange=str.index(str.endIndex,offsetBy:-4)..<str.index(before: nString可以通过下标、prefix、suffix等截取子串,子串类型不是String,而是varstr=//varsubstr1=//varsubstr2=//varrange=str.startIndex..<str.index(str.startIndex,offsetBy:3)varsubstr3=str[range]//最初的String,1_2_3_4_5//Substring->Stringvarstr2=String(substr3)nSubstring和它的basenSubstring发生修改或者转为String时,会分配新的内 Stringforforcin"jackc是Character类型}varstr=c是Charactervarc=nBidirectionalCollectionpstartIndex、endIndex属性、indexpString、Arrayn ceableCollectionpappend、insert、removepString、ArraynDictionary、Set也有实现上述协议 的一些方法,只是并没有遵守上述协thethefirstquote"""twoquotes"""allthreequotes12341//缩进以结尾的3//缩进以结尾的3letstr=1234//如果要显示3引号,至少转义1letstr= thefirstquote\""" twoquotes\"\"" allthreequotes\"\"\"letstr="""3////以下2letstr1="Thesearethesame."letstr2="""Thesearethesame.StringnString与NSStringp如果你觉得String的API过于复杂难用,可以考虑将String转为varvarstr1:String="jack"varstr2:NSString=varstr3=str1asNSStringvarstr4=str2asString//varstr5=str3.substring(with:NSRange(location:0,length:2))npStringpNSString使用isEqual运算符(本质还是调用了isEqual方法⇌←⇌←⇌←⇌←protocolprotocolRunnable1:AnyObject{}protocolRunnable2:class{}@objcprotocolRunnable3{}n被@objc修饰的协议,还可 给OC去遵守实@objcprotocolRunnable{funcrun1()@objcprotocolRunnable{funcrun1()@objcoptionalfuncrun2()funcrun3()}classDog:Runnablefuncrun3()func}{print("Dog{print("Dog}}vard=d.run1()//d.run3()//n被@objcdynamic修饰的内容会具有动态性,比如调用 走runtime那一套流classclassDog:NSObject@objcdynamicfunctest1(){}functest2(){}}vard=Dog():NSObject@objcdynamicvarage:Int=varobserver:Observer=Observer()overrideinit(){forKeyPath:"age",options:.new,context:nil)}deinitforKeyPath:}}varp //observeValueOptional(20)p.age=20//observeValuep.setValue(25,forKey:nSwift支持KVC\KVOp属性所在的类 器最终继承自p用@objcdynamicclassclassObserver:NSObjectoverridefuncobserveValue(forKeyPathkeyPath:ofobject:change:[NSKeyValueChangeKey:Any]?,context:UnsafeMutableRawPointer?){print("observeValue",change?[.newKey]as}}:NSObject@objcdynamicvarage:Int=varobservation:NSKeyValueObservation?overrideinit(){observation=observe(\ .age,options:.new){ ,change)inprint(change.newValueas}}}varp //Optional(20)p.age=20//p.setValue(25,forKey:{privatestaticvarAGE_KEY:Void?varage:Int{get(objc_getAssociatedObject(self,&Self.AGE_KEY)as?Int)??}set}}}varpprint(p.age)//p.age=print(p.age)//关联对象(Associatedn在Swift中,classn默认情况,extension不可以增 属p借助关联对象,可以实现类似extension为class增 属性的效enumRenumRenumstringString{caseadd="添加"}enumimage:String{caselogo}enumsegue:String{caselogin_main}}letimg=UIImage(named:letbtn=UIButton(type:.custom)btn.setTitle("添加",for:.normal)performSegue(withIdentifier:"login_main",sender:letimg=letimg=letbtn=UIButton(type:.custom)btn.setTitle(R.string.add,for:.normal)performSegue(withIdentifier:R.segue.login_main,sender:extensionextensionUIImageconvenienceinit?(_name:R.image){self.init(named:name.rawValue)}}extensionUIViewControllerfuncperformSegue(withIdentifieridentifier:R.segue,sender:Any?){performSegue(withIdentifier:identifier.rawValue,sender:}}extensionUIButtonfuncsetTitle(_title:R.string,forstate:UIControl.State){setTitle(title.rawValue,for:state)}}letimgletimg=UIImage(named:letfont=UIFont(name:"Arial",size:/mac-cain13/R.swiftletimgletimg=letfont=enumRenumimagestaticvarlogo=UIImage(named:}enumfontstaticfuncarial(_size:CGFloat)->UIFont?{UIFont(name:"Arial",size:size)}}}publicpublictypealiasTask=()->publicstaticfuncasync(_task:}Task)publicstaticfuncasync(_task: _mainTask: Task)_async(task,}privatestaticfunc_async(_task:_mainTask:Task?=nil){letitem=DispatchWorkItem(block:task)DispatchQueue.global().async(execute:item)ifletmain=mainTaskitem.notify(queue:DispatchQueue.main,execute:}}publicstaticfuncdelay(_seconds:_block:@esca Task)->DispatchWorkItem{letitem=DispatchWorkItem(block:block)DispatchQueue.main.asyncAfter(deadline:DispatchTime.now()+seconds,execute:return}publicstaticfuncasyncDelay(_seconds:_task:@esca Task)->DispatchWorkItem{return_asyncDelay(seconds,task)}publicstaticfuncasyncDelay(_seconds:_task: _mainTask:@esca Task)->Dispatch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论