天天看點

ios學習筆記(一)包括類和對象的初始化

**

ios上課學習

**

2018-9-6

ios初步的文法簡介和相關類型

//: Playground - noun: a place where people can play

import UIKit

//可以用let或者var定義
let label = "The width is"
//用\()可以将資料轉換成字元串
//補碼在計算機負數總比證書多一個數
//元祖tuple
  //遠足可以分解,可以用下标通路元組中每個值
    let amount = (100,"eur")
    let currency = amount.1
  //元組可以給每個元素命名
    let mon = (amount:100,currency:"eur")
    let cur = mon.currency
  //元組分解可以指分解部分值,其他值用_代替
    //let (cur,_) = mon
//swift沒有++,--,for,一律用for..in代替,in後是可以放任何有順序的,if後沒有圓括号,且條件必須是bool值的
let ind = [56,76,87,98]
for score in ind {
    print(score)
}
//===,!==判斷是否是同一個應用對象,或者是位置
//字典key-value,最後一個元素後面允許有個逗号
var occupations = [
    "ma":"ca",
    "ka":"ner",
]
occupations["ja"] = "pu"
//空數組
let emptyArray = [String]()
//空字典
let e = [String:Float]()
//元組(元組的作用)
var x = 1, y = 2
print("x=\(x) y=\(y)")
(x,y) = (y,x)
print("x=\(x) y=\(y)")
//字典的通路快,但是順序和放入的順序不同,因為是哈希表,數組通路速度很慢,元組可以同時存多類型的元素,并且個數固定,不可增加删除,一般适合少量資料
//switch
var age = 60
switch age {
case let x where x < 18:
    print("少年")
default:
    print("其他")
}
//函數(_空标簽,否則要加上參數名)
func greet(_ person:String,_ day:String) -> String{
    return "hello \(person) on \(day)"
}
var m = greet("jfa","28193")

func add(x:intptr_t,y:intptr_t) -> intptr_t {
    return x+y
}
var r = add(x: 1, y: 2)

print(r)
//..<不包括上界,...包括上界


//可選值
var k:String? = "hello world"
print(k)
var str:String = ""
if k != nil {
    str = k!
}

//函數可以嵌套,函數是一等公民,可以做很多事情,還可以作為函數的傳回值,最外層的傳回值是被傳回的函數的參數和傳回值類型
func ma() -> ((intptr_t) -> intptr_t){
    var number = 0
    func addone(number:intptr_t) -> intptr_t{
        return 1+number
    }
    return addone
}
//函數可以作為參數
//閉包,函數是有名字的閉包,還有一種沒有名字的閉包(匿名函數)
var primes = [Int]()
for i in 2...100 {
    var isPrime = true
    for j in 2..<i{
        if i % j == 0{
            isPrime = false
        }
    }
    if isPrime {
        primes.append(i)
    }
}
primes.sorted()

func compare(one:Int,two:Int) -> Bool {
    return one > two
}
primes.sort(by: compare(one:two:))

primes.sort(by: compare)
primes.sort(by: {
    (one:Int,two:Int) -> Bool in
    return one > two
})
primes.sort(by: {
    (one,two) in one > two
})
primes.sort(by: { $0 < $1 })
primes.sort { $0 < $1 }
primes.sort(by: >)

print(primes)
           

數組例題(數組排序)

//例題
var primes = [Int]()
for i in 2...100 {
    var isPrime = true
    for j in 2..<i{
        if i % j == 0{
            isPrime = false
        }
    }
    if isPrime {
        primes.append(i)
    }
}
//再建一個保留正序
var primes1 = [Int]()
primes1 = primes
/**for item in primes1 {
	print(item)	
}*/
//使順序變成倒序的
//方法一
/**
func compare(n1:Int,n2:Int)->Bool{
		return n1>n2
}
primes1.sort(by:compare(n1:n2:))*/

//方法二
/**
func compare(n1:Int,n2:Int)->Bool{
		return n1>n2
}
primes1.sort(by:compare)*/

//方法三
/**
primes1.sort(by:{
	(one:Int,two:Int) -> Bool in
	return one>two
})*/

//方法四
/**
primes1.sort(by:{
	(one,two) in return one>two
})*/

//方法五
/**
primes1.sort(by:{
	(one,two) in one>two
})*/

//方法六
/**
primes1.sort(by:{$0>$1})*/

//方法七
primes1.sort(by:>)

print(primes1)
           

ios中的類和對象

<注意>

1.系統要求存儲屬性必須初始化

2.可選值可以不初始化,預設将設定為nil

3.如果非可選類型存儲屬性不設定預設值,則必須在初始化方法中對其進行初始化

4.類必須自己寫初始化方法,用來初始化沒有預設值的非可選存儲屬性

5.結構體系統預設會添加初始化方法,也可以自定義

6.子類如果沒有自己的初始化方法,系統預設使用父類的初始化方法,一旦有了自己的初始化方法,或者重寫了父類的初始化方法,則父類的所有初始化不能被子類調用

7.可以給子類添加和父類相同的初始化方法,但需要加上override 修飾

8.重寫父類的convenience修飾的便利初始化方法,不需要加override

9.用self來區分參數和執行個體變量

<類的初始化>

  • 使用init來建立一個構造器步驟
  • 1、設定子類聲明的屬性值 2、調用父類的構造器 3、改變父類定義的屬性值,其他的工作比如調用方法、getters和setters也可以在這個階段完成
    class Person{
        var firstName:String
        var lastName:String
        var age:Int
        var gender:Gender
        var fullName:String{
            get{
                return firstName+" "+lastName
            }
        }
         init(firstName:String,lastName:String,age:Int,gender:Gender){
            self.firstName = firstName
            self.lastName = lastName
            self.age = age
            self.gender = gender
        }
        convenience init(name:String) {
            self.init(firstName:name,lastName:"",age:18,gender:Gender.male)
        }
        var description:String {
            return "Name:\(fullName) Age:\(age) Gender:\(gender)"
        }
    }
               
  • 子類的定義
  • class Student: Person{
        var grade:Int
        init(firstName:String,lastName:String,age:Int,gender:Gender,grade:Int){
                self.grade = grade
            super.init(firstName:firstName,lastName:lastName,age:age,gender:gender)
        }
        convenience init(name:String) {
            self.init(firstName:name,lastName:"",age:18,gender:Gender.female,grade:60)
        }
        override var description:String {
            return super.description + " grade:\(grade)"
        }
    }
               
  • 對象的建立和類的使用
  • let p1 = Person(firstName:"li",lastName:"guiyang",age:43,gender:Gender.male)
    let p2 = Person(name:"gaoyuexiang")
    print(p1.description)
    print(p2.description)
    
    let s1 = Student(name:"fan")
    print(s1.description)
               
  • 最後的呈現效果
  • ![這裡寫圖檔描述](https://img-blog.csdn.net/20180907075933889?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMDQ5NjY1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 屬性可以有 getter 和 setter,這稱之為計算屬性 計算屬性 (閉包) 不直接存儲值,而是提供一個 getter 來擷取值,一個可選的 setter 來間接設定其他屬性或變量的值(即:計算屬性可以根據所設定内容,進行一些修改或計算) (Person類的屬性)
    var per:String {
    		get{
    			return "Name:\(fullName) Age:\(age) Gender:\(gender)"
    		}
    		set{
    			firstName = newValue;
    		}
    	}
    print(p1.per);
    p1.per = 'tan'
               

    類的初始化器

    1.指定初始化器(至少有一個,它會将類中所有的屬性指派初始化,并且一路往上調用類的父類的指定初始化器去初始化它們各自引入的屬性

    2.便利初始化器(可以沒有,不能被子類重寫或從子類中以super的方式被調用)

    ios學習筆記(一)包括類和對象的初始化

    初始化器調用規則:

    1、子類的指定初始化器必須要調用父類的指定初始化器

    2、便利初始化器必須調用同一類中定義的其他指定初始化器

    3、便利初始化器必須最終以調用一個指定初始化器結束

    ios學習筆記(一)包括類和對象的初始化
    3.required關鍵字
    ios學習筆記(一)包括類和對象的初始化
    4.可失敗構造器(init初始化方法可以通過在init關鍵字後面加上?或!将其變為可失敗初始化方法,表示某對象的初始化過程可能失敗,并傳回 nil)
    ios學習筆記(一)包括類和對象的初始化

    【未帶完序…】

    尴尬的分界線

    **

    2018-9-6

    as與is

    as用來類型轉換,如果不确定是否成功,可以在其後加?

    any

    any類型表示這個可以存任何類型,包括閉包

    struct和class

    //struct是傳值的,且沒有構造函數,類是傳引用(如果發生指派,那麼一個類變了,原來的那個也變,受影響,但是傳值不會影響)

    struct Student{
        var name:String
        var age:Int
    }
    var s1 = Student(name:"tjw",age:20)
    print(s1.name)
               

    //除了class和閉包都是值類型

    //最好盡量避免引用,隻要一個引用有強引用(互相引用)那麼會變成垃圾,造成記憶體洩漏,可以用weak聲明為弱引用(弱引用是optional,釋放後變為nil),記憶體中所有對對象的引用都是強引用

    閉包中的循環引用

    //閉包中的循環引用,閉包隻要用到變量肯定是強引用,在var前加lazy表示暫時不構造,但是釋放還是沒完全釋放,是以最好還要在{後面加[weak self] in。。。。

    lazy var printname:()->()={
        [weak self] in
        if let strongSelf = self{
            print("kdsjlflk")
        }
    }
               

    協定

    //協定有點像接口,類來實作協定,類必須有協定中的屬性

    print(p1)

    //協定還可以作為一個類的屬性

    擴充

    //擴充,是向一個已有的類,結構體,枚舉類型添加新的功能

    //添加長度機關double屬性

    extension Double{
     var km:Double{
         return self*1_000.0
     }
        var m:Double{
            return self
        }
    }
    let kmTest = 10.5.km
    print(kmTest)
               

    泛型

    //泛型:協定和比較兩個數大小的函數

    func isEqualInt(a:Int,b:Int) -> Bool{
        return(a==b)
    }
    func isEqualString(a:String,b:String) -> Bool{
        return (a==b)
    }
               
    //寫一個比較兩個數大小的通用函數(一個頂三)
    func isEquals<T:Comparable>(a:T,b:T)->Bool{
        return (a == b)
    }
    print(isEquals(a: 1, b: 2))
    print(isEquals(a: "fad", b: "fad"))
               

    補充

    //guard如果guard是真就不執行,與if相反,

    guard let x = someOptional else{
        return
    }
    print(x)
               
    //defer讀取牟檔案内容并處理資料,首先打開檔案夾,讀取檔案内容,處理資料,關閉檔案以及檔案夾,不會調這句話,函數整體推出後,才調用defer後面的語句
    func doSomething(){
        openDirectory()
        defer{closeDirectory()}
        openFile()
        defer{closeFile}
    }
               
    //final 表示不能被繼承,使用final聲明的屬性,方法和下标不能被重寫
    final class Person{}
               

    //構造與析構:構造函數名為init,析構為denit

    //通路範圍:子產品,源檔案

    //權限:private,fileprivate:隻要一個檔案就可以通路,internal:(隻能被子產品内部通路)預設的,寫的app所有都可以通路,public:代碼可以被任何人通路,可以被外面通路,且隻能用,不能派生,open:可以被任何人使用和派生

    //一些函數使用

    var numbers = [1,3,5,4,7,5,23,56,76]
    numbers.sort{ $0 > $1}
    print(numbers)
    var evens = numbers.filter { $0 % 2 == 0 }
    print(evens)
    var strNumbers = numbers.map { String($0) }
    //var strNumbers = numbers.map { "\($0)" }
    print(strNumbers)
    var sum = numbers.reduce(0,{ $0 + $1 })
    print(sum)
    var sqartsum = numbers.reduce(0,{ $0 + $1*$1 })
               

    2018.9.19

    git commit -am ‘第三次送出’

    git checkout

    git checkout – 名字

    git reset–hard HEAD//硬複制一份到

    //建分支

    git branch 分支名

    //強制切換分支

    git checkout -f second

    git checkout -f master

    補充