Swift当中的函数
关于Swift中的函数的叫法来自于官方文档function(函数)和method(方法),和OC中的方法C中的函数基本差不多,大体可以分为无参无返、有参无返、无参有返和有参有返四中类型。
Swift中函数的简单定义
func eat() ->Void {
print("正在吃饭");
}
func eatWith(food : String) {
print("正在吃\(food)");
}
func receiveMessage() -> String {
return "10086"
}
func getSumWith(num1 : Int, num2 : Int) ->Int {
return num1 + num2
}
eat()
eatWith(food: "油条")
print(receiveMessage())
print(getSumWith(num1: 10, num2: 20))
Swift中函数参数的使用
import UIKit
func calculate(num1 : Int, num2 : Int) -> Int
{
return num1 + num2
}
func calculate1(tmp1 num1 : Int, tmp2 num2 : Int) -> Int
{
return num1 + num2
}
func calculate2(_ num1 : Int, _ num2 : Int) -> Int
{
return num1 + num2
}
calculate(num1: 10, num2: 20)
calculate1(tmp1: 20, tmp2: 10)
calculate2(30, 20)
func calculateWithNums(_ nums : Int...) ->Int {
var sum = 0
for num in nums {
sum += num
}
return sum
}
calculateWithNums(20,10,11,32)
func getCoffeeWithName(_ name : String = "雀巢") -> String {
return "获得一杯\(name)"
}
getCoffeeWithName()
func exchangeNums(_ num1 : inout Int, _ num2 : inout Int ) {
let tmp = num1
num1 = num2
num2 = tmp
}
var num1 = 10; var num2 = 20
print("num1 = \(num1) num2 = \(num2)")
exchangeNums(&num1, &num2)
print("num1 = \(num1) num2 = \(num2)")
Swift中的枚举
枚举是定义了一个通用类型的一组相关的值,可以在代码中以安全的方式使用这些值。
在C和OC当中枚举是指定相关名称为整型值(有名字的常量)。
在Swift中枚举更加的灵活,不必给每一个枚举成员提供一个值,也可以提供值为字符串,字符,或是整型和浮点型。
Swift中如何定义一个枚举
import UIKit
enum GenderType {
case male
case female
case unknown
}
let gender_01 : GenderType = .male
let gender_02 : GenderType = GenderType.female
enum DirectionType : String {
case east = "east"
case south = "south"
case west = "west"
case north = "north"
}
let dir = DirectionType(rawValue: "south")
if let dir = DirectionType(rawValue: "west") {
print(dir.rawValue)
}
enum CoffeeType : Int {
case nescafe = 0, cappuccino, mocha
}
print(CoffeeType.cappuccino.rawValue)
Swift中的结构体
结构体(struct)是由一系列相同类型或不同类型的数据构成的数据集合,结构体是值类型,在方法和函数中是值传递。
Swift中结构体的基本使用
import UIKit
struct HWLocation {
var x : Double
var y : Double
}
let struct_01 = HWLocation(x: 10, y: 20)
struct Location {
var x : Double
var y : Double
func printLocation() {
print("Location x : \(self.x) y : \(self.y)")
}
mutating func changeLocation(_ x : Double, _ y : Double) {
self.x = x
self.y = y
}
}
var struct_02 = Location.init(x: 20, y: 100)
struct_02.printLocation()
struct_02.changeLocation(9, 9)
print(struct_02)
struct Registration {
var userName : String
var userAge : Int
var ID_card : String
var email : String
init(_ userName : String = "用户名", _ userAge : Int = 18, _ ID_card : String = "666", _ email : String = "123.qq.com") {
self.userName = userName
self.userAge = userAge
self.ID_card = ID_card
self.email = email
}
}
let register = Registration("香格里拉", 20)
print(register)
Swift中的类
Swift也是一门面向对象的语言,若想实例化对象必须要用到类,在Swift当中我们用关键词class来定义一个类。
Swift中类的定义
import UIKit
class Person : NSObject {
var name : String
var age : Int
override init() {
name = "陈冠希"
age = 18
}
}
let p = Person()
print("姓名:\(p.name) 年龄:\(p.age)")
Swift中多种属性
在Swift中类的属性大体分为三种:存储属性、计算属性、类属性。
import UIKit
class Person : NSObject {
var name : String = "张柏芝"
var age : Int = 0
var mathScore : Double = 59.9
var englishScore : Double = 70.0
var averageScore : Double {
set {
}
get {
return (mathScore + englishScore) * 0.5
}
}
var printInfo : String {
return "姓名:\(name) 年龄:\(age) 数学成绩:\(mathScore) 英语成绩:\(englishScore)"
}
static var courseCount : Int = 2
}
let p = Person()
print(p.name)
print(p.averageScore)
print(Person.courseCount)
Swift中的属性监听器
import UIKit
class Person : NSObject {
var name : String = "" {
willSet(newName) {
print("属性即将发生改变 旧值:\(name) 新值:\(newName)")
}
didSet(oldName) {
print("属性发生改变 旧值:\(oldName) 新值:\(name)")
}
}
}
let p = Person()
p.name = "小布什"
p.name = "奥巴马"
Swift中的构造函数
import UIKit
class Person : NSObject {
var name : String = ""
var age : Int = 0
var height : Double = 0.0
init(name : String, age : Int, height : Double) {
self.name = name
self.age = age
self.height = height
}
init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
let dict : [String : Any] = ["name" : "谢霆锋", "age" : 19, "height" : 1.88]
let p2 = Person(dict: dict)
print(p2.name, p2.age, p2.height)
Swift中的析构函数
Swift中的析构函数其实就是OC中的dealloc方法,在ARC下不可手动调用。Swift通过自动引用计数来处理实例对象的内存管理,当一个实例对象的引用计数为0时,系统会自动调用该对象的析构函数。通常在西沟函数中,会释放一些资源,如监听通知的对象等。
mport UIKit
class Person : NSObject {
deinit {
print("人被释放了")
}
}
var p : Person? = Person()
p = nil
Swift中的循环引用问题
在Swift中系统也是通过实例对象的引用计数来管理内存的,当一个对象被强引用时,引用计数+1,当强引用消失时,引用计数-1;在实例对象的引用计数为0时,对象被释放。但是在ARC下也有可能发生内存泄漏问题,比如出现循环引用。
import UIKit
class Person : NSObject {
var name : String = ""
weak var book : Book?
deinit {
print("人已经被销毁")
}
}
class Book : NSObject {
var name : String = ""
var owner : Person?
deinit {
print("书已经被销毁")
}
}
var book : Book? = Book()
var p : Person? = Person()
p?.book = book
book?.owner = p
p = nil
book = nil
Swift中的可选链
import UIKit
class Person : NSObject {
var name : String = ""
var dog : Dog?
}
class Dog : NSObject {
var name : String = ""
var toy : Toy?
}
class Toy : NSObject {
var name : String = ""
var price : Double = 0
func flying() {
print("飞盘在非")
}
}
let person = Person()
let dog = Dog()
let toy = Toy()
dog.toy = toy
person.dog = dog
print(person.dog!.toy!.price)
if let d = person.dog {
if let t = d.toy {
print(t.price)
}
}
if let price = person.dog?.toy?.price {
print(price);
}
person.dog?.toy?.price = 9.99
if let price = person.dog?.toy?.price {
print(price);
}
person.dog?.toy?.flying()
Swift中协议的基本使用
import UIKit
protocol TestProtocol {
func eat()
func sleep()
}
class person : TestProtocol {
func eat() {
print("吃饭")
}
func sleep() {
print("睡觉")
}
}
class Student : NSObject, TestProtocol {
func eat() {
print("吃饭")
}
func sleep() {
print("睡觉")
}
}
protocol DriverProtocol : class {
func drivering()
}
class Boss : NSObject {
weak var driver : DriverProtocol?
func goHome() {
driver?.drivering()
}
}
class Driver : NSObject, DriverProtocol {
func drivering() {
print("开车")
}
}
let boss = Boss()
let driver = Driver()
boss.driver = driver
boss.goHome()
@objc protocol Test2Protocol : class {
func RequiredFunc()
@objc optional func optionalFunc()
}
class Teacher : NSObject, Test2Protocol {
func RequiredFunc() {
print("必须实现的方法")
}
}