学习iOS swift问题记录

原创 2016年06月02日 11:47:25

不断持续更新中

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 UIKit
class 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细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类...
  • binyao02123202
  • binyao02123202
  • 2016年08月21日 17:44
  • 2493

【iOS】一种仿京东搜索历史记录的表格的实现(sqlite3的使用)

功能点 准确的来说,不是仿制京东的,因为年前就是做好了这个功能。昨天看看京东,发现效果是一样的。 年前公司APP的功能需求点: 1.限制最多存储20条历史搜索数据(Demo为了演示,做的是5...
  • zhuming3834
  • zhuming3834
  • 2016年04月10日 10:52
  • 4785

《从零开始学Swift》学习笔记(Day 40)——析构函数

原创文章,欢迎转载。转载请注明:关东升的博客 与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程。在析构过程中也会调用一种特殊的方法deinit,称为析构函数。析构函数dein...
  • tonny_guan
  • tonny_guan
  • 2015年11月25日 10:28
  • 2004

Swift里的算法和数据结构

在这篇博客里,会教给大家如何实现一个Swift tree的数据结构。这是一个比较普遍而且有用的数据结构,也是你学习最好的一个开始。 翻译自:https://www.raywenderlich.com...
  • philar2016
  • philar2016
  • 2017年02月27日 11:43
  • 645

iOS 开发 - Swift 全面系统的学习(持续更新...)

最近项目不算紧,于是就学了学 Swift ,看了一大神写的项目https://github.com/hrscy/DanTang,很受益,感谢开源!另外自己也写了一些基础代码,分享出来,第一是希望得到同...
  • lpk15737314343
  • lpk15737314343
  • 2017年08月22日 20:01
  • 178

IOS swift版 sqlite3详解

IOS中的SQLite3的封装与详细应用SQLite是一个开源的嵌入式关系数据库,特点是易使用、高效、安全可靠、可移植性强。IOS中的本地持久化存储NSUserDefault:一般用于存储小规模数据、...
  • tianjifou
  • tianjifou
  • 2017年03月01日 16:11
  • 894

关于单元测试的学习记录

关于项目单元测试学习总结
  • u014378902
  • u014378902
  • 2016年05月05日 23:12
  • 346

IOS 记录用户登陆状态 第二次免登陆

NSUserDefault是苹果提供给我们用来存储用户的登陆信息的持久化类。下面用实例看下记录登陆状态的过程...
  • zhongyuan_1990
  • zhongyuan_1990
  • 2015年04月09日 19:50
  • 5676

Swift学习过程问题记录

TextField退出键盘: 1、sender.resignFirstResponder(); 2、self.view.endEditing(true); 定义Model类时,为了方便编程人员之间...
  • u011290399
  • u011290399
  • 2014年12月21日 14:11
  • 2008

TableViewCell的复用出现数据重复的解决方法

用tableview的时候特别容易会出现cell的数据重复问题,所以就整理了下解决办法,以后用起来方便,同时也希望对大家有所帮助。第一种cell的复用写法- (UITableViewCell *)ta...
  • iCandyss
  • iCandyss
  • 2016年01月28日 18:09
  • 6291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习iOS swift问题记录
举报原因:
原因补充:

(最多只允许输入30个字)