Swift的一些高级技巧
life cycle的代码实现
我们会发现,新建一个UIViewController以后,xcode会默认提供一个函数给你。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
这个函数就是当此ViewController生成了一个新的实例的时候,就会被调用。
与之相对应的是一个叫做deinit的函数。
deinit {
num = num + 2
inputBox.text = String(num)
}
closure
swift中的闭包类似c++中的块。它可以捕捉和保存任何常数或者变量的引用。
闭包,其实就是指程序语言中能让代码调用已运行的函数中所定义的局部变量。
简单来说可以把闭包理解成保护内部变量的一种手段,也就是为函数建立一个私有的变量的。
Extension
extension这一个关键字可以帮助扩充一些类的方法。但是不可以override。
但是需要注意的是,这一功能有可能会被滥用。但是也可以帮助我们组织我们的代码。
Protocols
protocols有点像一个api,他是一群方法的集合。他是一种类型。
protocols本身不可以自己实现自身,它只能够在方法相应的类里面实现。
一般来说是先定义好protocols,然后需要有一个相应的类/struct来说我会来接手。最后这个类/struct必须把protocols的所有方法实现。
典型的定义如下:
protocol SomeProtocol: clsss, InheritedProtocol{
var property: Int
func aMethor()->{}
mutating func changeColor()
}
protocol的作用在于协作。在一般的公司里面,都会使用protocol来去定义需要的东西,告诉别人要实现什么。
Delegation
假如view需要和controller通讯,那么可以使用delegation的方式来达到。具体的操作如下:
ScrollView
定义scrollview的方式是首先定义contentSize。
scrollView.contentSize = CGSize(width: 3000, height: 2000)
aerial.frame = CGRect(x: 150, y: 200, width: 2500, height: 1600)
scrollView.addSubview(aerial)
这样一来,效果就是scrollview可以四处浏览这个大画布的各个角落。
scrollview也可以zooming,以下两个参数可以定义最大最小的限制。
scrollView.minimumZoomScale = 0.5
scrollView.maximumZoomScale = 2.0
Demo
首先新建一个viewcontroller,用来装载图像。
这次我们的model将会是一个url,用来指示图像的位置。
这一次我们尝试使用代码添加subview,代码如下:
private var imageView = UIImageView()
override func viewDidLoad(){
super.viewDidLoad()
view.addSubview(imageView)
}
我们设置一个变量给图片,然后每次导入以后要设置为适配。
func fetchImage(){
if let url = imageURL{
let imageData = try! Data(contentsOf: url)
if imageData != nil
{
image = UIImage(data: imageData)
}
}
}
private var image: UIImage?{
set{
imageView.image = newValue
imageView.sizeToFit()
}
}
这个时候运行会报错,原因是图片来源是不安全的http链接。要解决这个问题,只需要进入info.plist里面增加一个App Transport Security Setting,然后下拉选择字典中的Allow Arbitrary Loads,值设置为YES就可以了。
Boom!成功了!
然后我们给应用增加一个ScrollView。
在storyBoard里面添加一个scrollview,然后拖拽到controller里面。然后把UIImage添加成为ScrollView的Subview。
ScrollView.addSubview(imageView)
最后一定要记得设置contentsize!
ScrollView?.contentSize = imageView.frame.size