学习iOS swift问题记录
来源:互联网 发布:java web javascript 编辑:程序博客网 时间:2024/06/03 16:30
不断持续更新中
1、关于返回按钮:
如果是使用push方式跳转页面,返回时使用self.navigationController?.popViewControllerAnimated 方法(默认动画效果是从右往左,返回动画相反)
如果是使用present方式跳转页面,返回时使用self.dismissViewControllerAnimated 方法 (默认动画效果是从下往上,返回动画相反)
2、关于swift中定义类似于OC中block回调方法的定义方式:
第一步:typealias MenuButtonBlock = () -> () 定义一个类型为MenuButtonBlock的回调方法
第二步:在class中定义一个变量,类型为MenuButtonBlock eg:var clickedBlock: MenuButtonBlock?
第三步:使用此属性 eg:func testBlock(action:MenuButtonBlock) {//your code...} action即为testBlock方法的回调函数
在swift中的叫法叫闭包函数 closure
3、关于计算变量:
import UIKitclass Test: NSObject { var a:Int = 1 var b:Int = 2// var sum = a + b 这一行会报编译错误 var sum:Int { return a + b }}其中sum就是计算属性
4、关于?与!的区别:?表示对象接受为nil的情况发生,!类似强制解包的概念
class Test: NSObject { var str1:String! var str2:String? func printTest() { self.str1 = "测试" //如果注释掉此行时,第一条打印会报error,程序崩溃 self.str2 = "测试" //如果注释掉此行时,第二条打印结果为 "nil\n",第三条打印会报error,程序崩溃 print(self.str1) //打印结果为 "测试\n" print(self.str2) //打印结果为 "Optional("测试")\n" print(self.str2!) //使用!强制解包,打印结果为 "测试\n" }}
5、关于变量setter getter方法的使用,接着上一个例子:
class Test: NSObject { var str1:String { set{ print("set str1") //给str1赋值时执行 } get{ print("get str1") //获取str1时执行,必须要return return "123" } } var tmpStr:String? var str2:String = "" { //切忌在内部给str2赋值,要不然会产生死循环,编译也无法通过 willSet{ print("willSet str2") //将要给str2赋值时执行 tmpStr = "1" } didSet{ print("didSet str2") //str2赋值结束后执行 tmpStr = "2" } } func printTest() { print(str1) //此处打印结果为 "get str1\n" "123\n" str2 = "345" //此处打印结果为 "willSet str2\n" "didSet str2\n" print(str2) //此处打印结果为 "345\n" print(tmpStr!) //此处打印结果为 "2\n" //set和get可以同时存在,willSet和didSet可以同时存在,这2组之间不能有交叉使用 }}
6、关于OC中三目运算符的奇怪写法(?: 连到一块)
BOOL flag = (10 == 11) ?: 0;我是第一次见这种写法,测试的结果flag 为 NO。如果把后台的0换成任意其它数的话,返回YES;如果把条件换成 10==10的话,返回YES;(0为NO,非0为YES)
根据实验得出自己的结论:?和:之间可以缺省,默认为1,因此flag只能是数字或可以接收数字类型的变量
7、关于swift中实现多个代理,比如有这样一个需求:在某一个UIView中,要实现UIScrollViewDelegate,同时也要实现自己的delegate
在OC中有如下代码,在.h文件中:
@property (nonatomic, weak) id <MyViewDelegate, UIScrollViewDelegate> delegate;以上代码中,MyViewDelegate为自定义protocol,在swift中是不支付这种语法的,那在swift中应该如何实现这种方式呢?
第一步:在自定义protocol MyViewDelegate时,让它继承UIScrollViewDelegate
第二步:不能使用 var delegate:MyViewDelegate? 这种方式,因为delegate这个成员变量与UIScrollView默认的delegate变量名称相同,因此只需要将变量名改变为非delegate名称即可,比如这样定义 var myDelegate:MyViewDelegate?
8、swift中定义的protocol中的方法默认都是必需要实现的,但是在有些需求中的某些delegate中的方法如果太多,但是又不一定是必须要实现的话,这样就会造成不必要的时间浪费。那应该如果像OC中那样,使其中的某些方法是可选的呢?有2种方式供选择:
第一种方式:
@objc protocol MyViewDelegate { func requireMethod() optional func optionalMethod()}2个关键词:@objc和optional,这2个要配合使用才有效果;标记为optional的方法是可选的方法
第二种方式:
protocol MyViewDelegate { func requireMethod()}extension MyViewDelegate { func optionalMethod(){ }}注意:这种方式的optional方法是必须要实现的,可以是个空方法
- 学习iOS swift问题记录
- Swift学习过程问题记录
- Swift语言问题记录
- swift 学习 记录
- Swift学习感悟记录
- swift学习记录(enumerate)
- Swift 学习记录--2
- Swift 学习记录
- IOS开发学习过程问题点记录
- ios swift 学习
- 记录学习Swift的过程
- swift学习记录(开端)
- swift学习记录(Optional)
- swift学习记录(switch)
- swift学习记录(for)
- swift学习记录(func)
- 操作 swift学习记录(-)
- swift学习记录(selector)
- content-type
- Windows下MySql错误代码1045的解决方法
- Android手机通过wifi进行数据传输(二)
- oracle 11gR2RAC修改public ip (同网段)
- Ubuntu 默认Nginx+php-fpm报502 504 50X问题的解决
- 学习iOS swift问题记录
- Java虚拟机(JVM)的内存设置
- Git中文手册 - 高级用法
- 实例讲解Nginx下的rewrite规则
- Picasso入门教程(一)
- iOS中通过字符串创建类(Swift)
- 启用新博客域名 www.qiuchengjia.cn
- 数组与指针
- apache 域名转发功能