標籤:
1.?和!的區別
在swift中,可選類型(?)其實質是一個枚舉類型,裡面有None和Some兩種類型,其實nil的值相當於optional.None,沒有值就相當於optional.None,如果有值就相當於optional.Some
//MARK: - !和?區別
1.解包
?:有值,沒值(nil)
!:強制解包
eg: var number : Int? = 8
var number1 = number
print(number1)
注意:如果對沒有值的變數進行強制解包的情況下回造成崩潰
2.可選綁定,不用強制解包
if var number2 = number {
print(number2)
}
//隱式解析可選類型:有值,沒值
var intNumber :Int != 10
var intNumber1 = intNumber
print(intNumber1)
注意:如果!強制解析沒值的變數,也會造成崩潰
可選綁定:
if var intNumber2 = number {
print(intNumber2)
}
//MARK: - 結構體
1.聲明一個結構體
struct Rect {
//聲明結構體變數的屬性 (儲存屬性)
var x : Float
var y : Float
var width : Float
var height : Float
//聲明結構體屬性,要使用static
static var description : String ?
//聲明一個計算屬性(是用來專門計算結構體變數屬性的setter的方法,和getter方法,其本身並沒有儲存功能)
var centerX : Float {
//set方法
set {
x = newValue
}
//get方法(必須的有)
get {
return x / 2
}
}
//聲明方法
//聲明一個結構體變數的方法(相當於oc中的執行個體方法)
func frameInfor () {
print ("x:\(x),y:\(y),width:\(width),height:\(height)")
}
//聲明一個結構體方法(相當於oc中的類方法,使用static方法修飾)
static func infor() {
print("這是結構體方法")
}
}
//1.根據結構體去定義一個結構體變數
var frame = Rect (x:10,y:10,width:100,height:100)
//2.訪問結構體變數中的屬性
//注意:結構體變數的屬性類型可以使用let去修飾,只不過訪問的時候不能對其進行修改
print(frame.x)
frame.x = 20
print(frame.x)
//3.訪問結構體屬性
Rect.description = "我是結構體屬性"
print(Rect.description)
//4.訪問計算屬性
frame.centerX = 200
//這句話就相當於在調用centerX的setter方法
let value = frame.centerX //這句話相當於在調用center中的set方法
print(value) //這句話就相當於調用center中的get方法
frame.frameInfor() //調用結構體變數的方法
Rect.infor() //調用結構體方法
//MARK: - 類(class)
class Person {
var name : String?
var age : Int?
//構造初始化方法
init(name : String age : Int) {
self.name = name
self.age = age
}
//自訂初始化方法
init(name : String) {
self.name = name
self.age = age
}
//自訂初始化方法
init(name : String) {
self.name = name
}
//聲明類屬性
static var introduce : String?
//計算屬性
var lalue : Int {
set(a) {
age = a //在寫計算屬性的時候,一定不能出現self,否則會造成死迴圈
}
get {
return age!
}
}
//聲明一個類方法
//1.在類方法前邊加上static修飾[雖然是一個類方法,但是該方法在子類中不能重寫]
static func sayHi() {
print(introduce) //注意:在類方法中只能使用類屬性,不能使用對象屬性
}
//2.在方法前邊加上class修飾[它是一個類方法,但是可以被重寫]
class func sayHi1() {
print(introduce)
}
//聲明一個執行個體(對象)方法
func sayHi2() {
print("hello,我是執行個體方法")
}
}
//建立對象[此時應該注意和oc區別開,執行個體對象,:後邊跟的是類(注意:要初始化對象一定要寫初始化構造的方法)]
var person1 : Person = Person(name : "MBBoy",age : 69)
//訪問類中的屬性
print(person.name!)
//屬性後+?和不加+的區別就是輸出的時候,是否用解包,帶?的不用optional裡的東西,就要用!解包,而不加問號的直接輸出就可以
//3.訪問類屬性
Person.introduce = "我是xxxx"
//4.訪問計算屬性
person1.value = 28
print(person1.value)
//5.訪問類方法
Person.sayHi()
Person.sayHi1()
//6.訪問執行個體方法
person1.sayHi2()
//聲明一個子類方法
class Student : Person {
//重寫父類的方法
//重寫類方法
override class func sayHi() {
print("我同桌是肉絲")
}
//重寫父類中的執行個體方法
override func sayHi2() {
print("我同桌是肉絲的子類,重寫了父類中的對象方法")
}
}
var student = Student (name : "rose",age : 38)
Student.sayHi1()
Student.sayHi2()
//MARK: - 實值型別和參考型別的區別
//實值型別
struct animal {
var name : String?
var age : Int?
init (name :String,age : Int) {
self.name = name
self.age = age
}
}
var dog = animal (name :"貝貝",age :3)
var dog1 = dog //此時將dog的資料拷貝給dog1
dog.name = "歡歡"
print("dog.name:\(dog.name),dog1.name:\(dog1.name)")
//結果:dog.name = "歡歡",dog1.name = "貝貝"
//引用實值型別(可以用dog改變dog1)
class animal {
var name : String?
var age : Int?
init (name : String,age : Int) {
self.name = name
self.age = age
}
}
var dog = animal (name : "flower",age : 0)
var dog1 = dog
print ("dog.name :\(dog.name) , dog1.name : \(dog1.name)")
//MARK: - 協議
//當swift中聲明協議的時候,協議裡有可選方法需要使用@objc關鍵字修飾
@objc protocol MarryDelegate {
func cook() //吃飯
func wash() //洗衣服
optional func hitDouDou() //打豆豆
}
protocol DivorceDelegate {
func divideMoney() //分割財產
}
//如果一個類要遵循協議的時候,如果這個類有父類,要在:後先寫父類,然後要遵循的協議
class Man : Person,MarryDelegate,DivorceDelegate {
@objc func cook() {
print("還好去新東方學了幾年廚師,終於可以大展身手了")
}
@objc func wash() {
print("還好有全自動洗衣機")
}
func divideMoney() {
print("分財產")
}
}
//建立一個男人
let man = Man(name :"fu",age :10)
man.cook()
man.wash()
man.divideMoney()
//MARK: - 擴充(extension)
//擴充協議中的相關方法(打豆豆)
extension Man {
@objc func hitDouDou() {
print("打你好爽")
}
}
man.hitDouDou()
//2.擴充還可以擴充類方法(給某一個雷添加方法,類似oc中的category類目)以及對象方法
extension Man {
//擴充一個對象方法
func sing() {
print("歌聲嘹亮惹人醉")
}
//擴充一個類方法
class func sleep() {
print("多喝水,早點睡")
}
man.sing()
man.sleep()
//MARK: - 閉包
//求兩個數的最大值
//使用閉包
var myBlock :((num1 : Int,num2 : Int) -> Int)
//第一種方式:
myBlock = {
(num1 : Int,num2 : Int) ->Int in //切記不能忘記in
return num1 > num2 ? num1 : num2
}
//第二種方式:
myBlock = {
num1,num2 in
return num1 > num2 ? num1 : num2
}
//第三種方式:
myBlock = {
num1,num2 in
num1 > num2 ? num1 : num2
}
//第四種方式:
myBlock: {
$0 > $1 ? $0 : $1
}
//第五種方式:
myBlock = {
(num1,num2) -> Int in
return num1 > num2 ? num1 : num2
}
let max = myBlock(num1 : 88,num2 : 66)
iOS-Senior14-Swift2