swift学习之语法基础二

命名空间

swift中引入了命名空间的概念,只要在同一个命名空间下所有的资源都是共享的,而且默认情况下项目名称就是命名空间;如果使用swift开发中使用第三方框架最好使用cocospad,这样第三方的所有东西都会被另外一个工程所管理,不会因为命名空间问题产生,变量等的重定义。

1、获取命名空间名称

//获取命名空间
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String`
//用字符串创建类
let aClass = NSClassFromString(namespace + "." + valueTypeString)
//用字符串创建控制器
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
 // let cls = NSClassFromString(namespace + "." + "HomeTableViewController") as! UIViewController.Type
    let clsName = NSClassFromString(namespace + "." + "HomeTableViewController")
    let cls = clsName as! UIViewController.Type
    let vc = cls.init()
    print(vc)

2、修改命名空间名称

Snip20160301_1.png

可选类型

1、swift中的方法或者数据类型后面有一个?就代表返回的是一个可选类型Optional。
2、可选值必须解包才可以参加计算,如果不解包可选值会被Optional包裹,是不能参加计算的
3、应该尽量使用guard let ... elseif let解包,避免一堆?!的情况
4、只有在迫不得已而且绝对确定强制解包不会导致崩溃的情况下,才使用强制解包,否则可能导致程序崩溃

1、可选类型的定义?

var name:String?//可选类型定义
name = "Hello world!!!"
print(name) //打印输出结果Optional("Hello world!!!")
print(name!)//强制解包输出结果Hello world!!!

2、可选类型解包

2.1、强制解包!:强制解包就是在需要强制解包的变量后面添加一个!
var fullName:String?
print(url!)//强制解包,奔溃
fullName = "姓名"
print(url!)//强制解包成功

为避免因为强制解包导致的奔溃,swift提供了可选值绑定

2.2、可选解包使用guard let ... elseif let解包

if let & guard let 的命名技巧:直接使用同名

//guard let ... else
var fullName:String?
var firstName:String?
var secondName:String?

fullName = "姓名"
firstName = "名字"
secondName = "姓氏"

guard let full_name = fullName,
          first_name = firstName,
          second_name = secondName else
{
     return;//本次解包不成功可选值存在`nil`,退出本次解包,也可能使用到`continue`
}

//解包成功
print(full_name + "," + first_name + "," + second_name)

//if let
var fullName:String?
var firstName:String?
var secondName:String?

fullName = "姓名"
firstName = "名字"
secondName = "姓氏"

if let full_name = fullName,
        first_name = firstName,
        second_name = secondName
{
    //解包成功
    print(full_name + "," + first_name + "," + second_name)
}
2.3、guard case let / if case let
2.4、for case let
2.5、switch case let

类型转换

swift不存在隐式类型转换
1)基础类型转换
目的类型(变量)刚好不同与OC
2)可选类型,对象,结构体类型转换isasas?as!
因为swift中的结构体和class都可以通过()来创建,所有基础类型的转换方法是不能做类型转换的
3)swift中除去String类型,其他多数情况下as需要使用as?as!,起码我很少见到

//is
是否可以做类型转换,可以返回true,不可以返回false
//as
//as?
带条件的类型转换,返回optional类型,转换成功返回转换后的值,失败返回nil
//as!
强制转换,返回指定类型,转换失败运行时报错
//as?和as!选择
要进行转换的是as?使用as?,是as!使用

懒加载

1、swift中的懒加载与OC不同,懒加载的闭包只会执行一次,然后分配独立的存储空间,即使将懒加载的变量直接设置为nil闭包也不会再执行一次,所以不要在内存警告的时候将懒加载的view设置为nil,从父控件移除
2、懒加载的本质是闭包
3、懒加载只在结构体和class中有效,不要在playground中直接使用
4、通常情况下只要在有初始化的变量前添加关键字lazy即可懒加载变量var name = ""懒加载称为lazy var name = ""
5、只能懒加载变量,常量不能懒加载
6、懒加载的构造方法没有智能提示,eg:UITableView懒加载就没有智能提示构造方法,得生敲

//完整版的懒加载代码
lazy var myView:UIView = { ()->UIView in
    return UIView()
}()
//常用的懒加载代码
lazy var myView:UIView = {
    //逻辑判断
    return UIView()
}()
lazy var myView:UIView = UIView()
lazy var name = ""

@objc

1、swift中使用@objc修饰的类型可以通过OC的Runtime的消息机制进行调用
2、在把按钮定义槽方法private后需要用@objc修饰槽方法,否则会调用失败,如果不用@objc修饰会报错
3、在使用optional关键字定义协议方法的时候需要用@objc修饰协议,因为swift中的协议方法默认是必须实现的,选择实现是OC的特性

//按钮槽方法
button.addTarget(self, action: #selector(test), for: .touchUpInside)
@objc private func test()
{
   
}
//定义协议
 @objc protocol MyProtocol {  
      optional func test() -> Int 
}  

.self,.Type,.Protocol

1、.self 可以用在类型后面取得类型本身,也可以用在某个实例后面取得这个实例本身
2、.Type 可以用在类型后面表示的是某个类型的元类型
3、.Protocol 可以用在protocol类型后面表示的是某个protocol类型的元类型

//注册cell
self.tableView.registerClass(
    UITableViewCell.self, forCellReuseIdentifier: "myCell")

//类型转换
vcType as! UIViewController.Type

private,internal,public,open(3.0),fileprivate(3.0)

这些保护作用域的关键字不能使用在方法内部,class内推荐使用fileprivate
1、private:作用域在当前的{}或者文件内
2、fileprivate:作用域在当前文件,推荐使用
3、internal:默认作用域
4、public:可以被任何人访问。但其他module中不可以被override和继承,而在module内可以被override和继承
5、open:可以被任何人使用,包括override和继承

异常处理

在需要异常处理的函数方法声明后面加throw关键字
在掉该方法的时候使用do{try}catch{}
try

//基本格式
do
{
    //没有异常的处理代码
   //将try关键字加在有throw关键字说明的函数调用前方空格隔开
}
catch
{
    //处理异常,默认的异常存储变量为error
    print(error)
}
//json序列化的例子
    //1、获取json数据
    //1.1获取json路径
    let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
    //1.2获取json数据
    if let jsonPath = path
    {
        let jsonData = NSData(contentsOfFile: jsonPath)
        //1.3json序列化
        do
        {
            
            let arrJson = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers)
//                print(arrJson)
            //2、便利数组
            //swift中便利数组必须告知数组元素都是什么类型
            for dict in arrJson as! [[String:String]]
            {
//                    print(dict)
                let vcName = dict["vcName"]
                let title = dict["title"]
                let imageName = dict["imageName"]
                addChildViewController(vcName!, title: title!, imageName: imageName!)
            }
        }
        catch
        {
            //没有服务器数据,创建本地控制器
            addChildViewController("HomeTableViewController", title: "首页", imageName:"tabbar_home")
            addChildViewController("MessageTableViewController", title: "消息", imageName:"tabbar_message_center")
            addChildViewController("DiscoverTableViewController", title: "发现", imageName:"tabbar_discover")
            addChildViewController("ProfileTableViewController", title: "我", imageName:"tabbar_profile")
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容