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! :类型转换的强制形式,向下转换为某个类型时,会进行强制解包,即:转换失败时触发运行时错误。使用场景:向下转换确定不会失败
网友评论