swift基础

2019-03-12  本文已影响0人  阿龍飛

Swift开发入门-基础知识:https://www.jianshu.com/p/3b01707fed18

Swift 之 Alamofire 网络请求、https://blog.csdn.net/lvchenqiang_/article/details/77418272

最近Swift项目实践的小分享: https://www.tuicool.com/articles/I7naYjm

常见和变量

let 用于定义常量,定义完后不能修改。
var 用于定义变量,可以修改。

        let a = 10
        print(a)
        
        var b = 20
        b = 30
        print(b)
        
        let c: Int = 10
        print(c)
        let d: CGFloat = 20.3
        print(d)
        
        let res = c + Int(d)
        print(res)

UIButton

 override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor  = UIColor.white
        // Do any additional setup after loading the view.
        
        let myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        myView .backgroundColor = UIColor.red
        view .addSubview(myView)
        
        let btn = UIButton(type: .custom)
        btn .setTitleColor(UIColor.black, for: .normal)
        btn .setTitle("FirstBtn", for: .normal)
        btn.backgroundColor = UIColor.yellow
        btn.frame = CGRect(x: 0, y: 0, width: 100, height: 50)
        btn.addTarget(self, action: #selector(buttonClick(btn:)), for: .touchUpInside)
        btn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        btn.layer.masksToBounds = true
        btn.layer.cornerRadius = 10.0
        btn.layer.borderColor  = UIColor.purple.cgColor
        btn.layer.borderWidth = 1
        myView .addSubview(btn)

    }
    
    @objc func buttonClick(btn:UIButton){
        btn.isSelected  = !btn.isSelected
        if btn .isSelected {
            btn.setTitle("Selected", for: .normal)
        }else{
            btn.setTitle("NoSelected", for: .normal)
        }
    }

什么是可选类型

可选类型伴随着Swift诞生,在原有的Objective-C语言中不存在,究其原因,是因为Swift是类型安全的语言,而OC则是弱类型语言,OC中 str字符串既可以是nil,也可以是字符串,而Swift中,这两种状态是不能同时存在的。
OC和Swift对于nil的解释也是不太一样的

var optionalStr: String? = "swift语言可选类型"//声明可选类型字符串,并赋初值
var opStu:Student? //声明可选opStu对象,赋初值nil

强制解析

当你确定自定义的可选类型一定有值时,可以使用操作符(!)进行强制解析,拿到数据,叹号表示"我知道一定有值,请使用它",但是当你判断错误,可选值为nil时使用(!)进行强制解析,会有运行错误。

var myStr:String? = nil
myStr="强制解析,一定有值"
if myStr != nil {
    print(myStr!)//使用!进行强制解析
}else{
    print("字符串为nil")
}

输出:强制解析,一定有值

自动解析

在最初的声明时使用?修饰,当你希望它自动解析是可以用!代替?来修饰,这样在变量使用时就不需要加!来强制拆包,它会自动解析。

var myStr:String! //使用!修饰
myStr="自动解析"
if myStr != nil {
    print(myStr)
}else{
    print("字符串为nil")
}

输出:自动解析

可选绑定

var myStr:String?
myStr="可选绑定"
if  let tempStr = myStr {
    print(tempStr)//如果myStr有值的话,就会赋值给tempStr,然后使用
}else{
    print("字符串为nil")
}
输出:可选绑定

as! 与 as? 的类型转换

向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。就是说强制从父类转换成子类

class Animal {}
class Cat: Animal {}
let animal :Animal  = Cat()
let cat = animal as! Cat

as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?

let animal:Animal = Cat()

if let cat = animal as? Cat{
    print("cat is not nil")
} else {
    print("cat is nil")
}

向下转换
某个类类型的常量或变量实际上可能是其子类的实例。这种情况下,我们会用到类型转换操作符( as? 或 as! )向下转换为子类类型。

as? :类型转换的条件形式,向下转换为某个类型时,返回该类型的可选值,即:转换失败时返回 nil 。使用场景:向下转换可能会失败的情况。

as! :类型转换的强制形式,向下转换为某个类型时,会进行强制解包,即:转换失败时触发运行时错误。使用场景:向下转换确定不会失败

上一篇下一篇

猜你喜欢

热点阅读