一、介绍

iOS8之前使用AssetsLibrary来获取相册资源,iOS新引入框架PhotoKit框架,也即Photos.framework

二、PhotoKit的基本构成包括如下几项:

  • PHAsset:代表照片库中的一个资源,跟ALAsset类似,通过PHAsset可以获取和保存资源(原图、不同尺寸的缩略图);
  • PHFetchOptions:获取资源时的参数,充当了过滤器的作用,可以过滤相册的类型、日期、名称等,从而直接获取对应的资源而不需要枚举。可以传 nil,即使系统默认值;
  • PHAssetCollection:PHCollection的子类,表示一个相册或者一个时刻,或者是一个只能相册(系统提供的特定的一系列相册,例如最近删除、视频列表、收藏等);
  • PHFetchResult:表示一系列的资源结果集合,也可以是相册的集合,从PHCollection的类方法中获取;
  • PHImageManager:用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个PHImageRequstOptions控制资源的输出尺寸等规格;
  • PHImageRequestOptions:如上面所说,控制加载图片的一系列参数;
  • PHCollectionList:表示一组PHCollection,本身也是一个PHCollection。

注意:PHCollection作为一个集合,可以包含其他集合,这使得Photokit的组成比AssetsLibrary要复杂一些。另外,与AssetsLibrary相似,一个PHAsset可以同时属于多个不同的PHAssetCollection,最常见的例子就是刚刚拍摄的照片,至少同时属于“最近添加”、“相机胶卷“以及”照片-精选“这3个PHAssetCollection。

三、PhotoKit结构图如下:

在PhotoKit中,采用”获取“的方式拉取资源,这些资源的手段都是一系列形如class func fetchXXX(...,options:PHFetchOptions)->PHFetchResult的类方法,具体根据需要获取的是相册、时刻还是资源来决定使用哪一个类方法,这类方法中option充当了过滤器的作用,可以过滤相册的类型、日期、名称等,从而直接获取对应的资源,而不需要枚举。

四、实例

1、列出系统所有的相册,并获取每一个相册中的PHAsset对象

  func fetchAllSystemAblum() -> Void {
let smartAlbums:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
print("智能\(smartAlbums.count)个") //smartAlbums中保存的是各个智能相册对应的PHAssetCollection
for i in ..<smartAlbums.count { //获取一个相册(PHAssetCollection)
let collection = smartAlbums[i] if collection.isKind(of: PHAssetCollection.classForCoder()) { //赋值
let assetCollection = collection //从每一个智能相册获取到的PHFetchResult中包含的才是真正的资源(PHAsset)
let assetsFetchResults:PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil) print("\(assetCollection.localizedTitle)相册,共有照片数:\(assetsFetchResults.count)") assetsFetchResults.enumerateObjects({ (asset, i, nil) in
//获取每一个资源(PHAsset)
print("\(asset)")
})
}
}
}

打印结果:

智能12个
Optional("Favorites")相册,共有照片数:
Optional("Recently Deleted")相册,共有照片数:
Optional("Panoramas")相册,共有照片数:
Optional("Camera Roll")相册,共有照片数:
<PHAsset: 0x7f9c94d09ab0> 106E99A1-4F6A-45A2-B320-B0AD4A8E8473/L0/ mediaType=/, sourceType=, (4288x2848), creationDate=-- :: +, location=, hidden=, favorite=
<PHAsset: 0x7f9c94c17760> B84E8479-475C--A4A4-B77AA9980897/L0/ mediaType=/, sourceType=, (4288x2848), creationDate=-- :: +, location=, hidden=, favorite=
<PHAsset: 0x7f9c94c18260> 9F983DBA-EC35-42B8--B597CF782EDD/L0/ mediaType=/, sourceType=, (3000x2002), creationDate=-- :: +, location=, hidden=, favorite=
<PHAsset: 0x7f9c94f13060> 99D53A1F-FEEF-40E1-8BB3-7DD55A43C8B7/L0/ mediaType=/, sourceType=, (1668x2500), creationDate=-- :: +, location=, hidden=, favorite=
<PHAsset: 0x7f9c94f070a0> ED7AC36B-A150-4C38-BB8C-B6D696F4F2ED/L0/ mediaType=/, sourceType=, (3000x2002), creationDate=-- :: +, location=, hidden=, favorite=
<PHAsset: 0x7f9c94f02b30> D98C084F-6C45-4E12-90FB-F866C16D290E/L0/ mediaType=/, sourceType=, (750x1414), creationDate=-- :: +, location=, hidden=, favorite=
Optional("Slo-mo")相册,共有照片数:
Optional("Screenshots")相册,共有照片数:
Optional("Bursts")相册,共有照片数:
Optional("Videos")相册,共有照片数:
Optional("Selfies")相册,共有照片数:
Optional("Hidden")相册,共有照片数:
Optional("Time-lapse")相册,共有照片数:
Optional("Recently Added")相册,共有照片数:
<PHAsset: 0x7f9c94f0ba80> D98C084F-6C45-4E12-90FB-F866C16D290E/L0/ mediaType=/, sourceType=, (750x1414), creationDate=-- :: +, location=, hidden=, favorite=

2、列出用户创建的相册,并获取每一个相册中的PHAsset对象,代码如下:

    func fetchAllUserCreatedAlbum() -> Void {
let topLevelUserCollections:PHFetchResult = PHCollectionList.fetchTopLevelUserCollections(with: nil) //topLevelUserCollections中保存的是各个用户创建的相册对应的PHAssetCollection
print("用户创建\(topLevelUserCollections.count)个") for i in ...topLevelUserCollections.count { //获取一个相册(PHAssetCollection)
let collection = topLevelUserCollections[i]
if collection.isKind(of: PHAssetCollection.classForCoder()) { //类型强制转换
let assetCollection = collection as! PHAssetCollection //从每一个智能相册中获取到的PHFetchResult中包含的才是真正的资源(PHAsset)
let assetsFetchResults:PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil) print("\(assetCollection.localizedTitle)相册,共有照片数:\(assetsFetchResults.count)") assetsFetchResults.enumerateObjects({ (asset, i, nil) in
//获取每一个资源(PHAsset)
print("\(asset)")
})
}
}
}

打印结果:

用户创建0个
-- ::36.859 PhotoKit[:] *** Terminating app due to uncaught exception 'NSRangeException', reason: '0x6000000bf560: index (0) beyond bounds (0)'

从PHAssetCollection中获取到的可以是相册也可以是资源,但无论是哪种内容,都统一使用PHFetchResult对象封装起来,因此虽然PHAssetCollection获取到的可能是多样的,但通过PHFetchResult就可以使用统一的方法去处理这些内容(遍历PHFecthResult)。

3、获取所有资源的集合,并按资源的创建时间排序

    func getAllSourceCollection() -> Array<PHAsset> {

        let options:PHFetchOptions = PHFetchOptions.init()
var assetArray = [PHAsset]()
options.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
let assetFetchResults:PHFetchResult = PHAsset.fetchAssets(with: options)
for i in ..<assetFetchResults.count {
//获取一个资源(PHAsset)
let asset = assetFetchResults[i] //添加到数组
assetArray.append(asset)
}
return assetArray
}

获取PHAsset对象中的图片,可以根据不同尺寸来获取

4、获取缩略图方法

    func getAssetThumbnail(asset:PHAsset) -> Void {

        //获取缩略图
let manager = PHImageManager.default()
let option = PHImageRequestOptions() //可以设置图像的质量、版本、也会有参数控制图像的裁剪
option.isSynchronous = true
manager.requestImage(for: asset, targetSize: CGSize.init(width: screenWidth/, height: scrrenHeight/), contentMode: .aspectFit, options: option) { (thumbnailImage, info) in print("缩略图:\(thumbnailImage),图像信息:\(info)")
}
}

打印结果:

缩略图:Optional(<UIImage: 0x600000282a80> size {, } orientation  scale 2.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
缩略图:Optional(<UIImage: 0x60800009ef00> size {, } orientation scale 2.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
缩略图:Optional(<UIImage: 0x600000282260> size {, } orientation scale 2.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
缩略图:Optional(<UIImage: 0x6000002837f0> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
缩略图:Optional(<UIImage: 0x608000096170> size {, } orientation scale 2.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
缩略图:Optional(<UIImage: 0x60800009ba30> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultDeliveredImageFormatKey"): , AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileOrientationKey"): , AnyHashable("PHImageResultWantedImageFormatKey"): ])
-- ::04.140065 PhotoKit[:] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: , persist_level: , default_ttl: , info_ttl: , debug_ttl: , generate_symptoms: , enable_oversize: , privacy_setting: , enable_private_data:

5、获取原图的方法

func getAssetOrigin(asset:PHAsset) -> Void {

        //获取原图
let manager = PHImageManager.default()
let option = PHImageRequestOptions() //可以设置图像的质量、版本、也会有参数控制图像的裁剪
option.isSynchronous = true
manager.requestImage(for: asset, targetSize:PHImageManagerMaximumSize, contentMode: .aspectFit, options: option) { (originImage, info) in print("原图:\(originImage),图像信息:\(info)")
}
}

打印结果:

原图:Optional(<UIImage: 0x6080000927f0> size {, } orientation  scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): c7a7c69e701599aee13bb84c1e55a47f91037ae2;;;000000000000001a;com.apple.app-sandbox.read;;;000000000031f4ae;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0002.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0002.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])
原图:Optional(<UIImage: 0x608000091fd0> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): d728ab2c6e1a21bfa86722cdbc32f929b286bd5a;;;000000000000001a;com.apple.app-sandbox.read;;;000000000031f492;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0001.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0001.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])
原图:Optional(<UIImage: 0x600000098100> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): 18d6c6a247c87b3f0dc28462a6b962e6291ca8d9;;;000000000000001a;com.apple.app-sandbox.read;;;000000000031f4b8;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0003.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0003.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])
原图:Optional(<UIImage: 0x600000098b50> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): 10f20330703638d2082f17b525df649aca573913;;;000000000000001a;com.apple.app-sandbox.read;;;000000000031f56b;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0004.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0004.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])
原图:Optional(<UIImage: 0x600000099960> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): 3f3fee9e75894783e86e2298ca4f6e12379aaa58;;;000000000000001a;com.apple.app-sandbox.read;;;000000000031f5ad;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0005.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0005.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])
原图:Optional(<UIImage: 0x608000092de0> size {, } orientation scale 1.000000),图像信息:Optional([AnyHashable("PHImageResultIsDegradedKey"): , AnyHashable("PHImageFileSandboxExtensionTokenKey"): f5885747ce5a87a7324c81812f06d3555df44873;;;000000000000001a;com.apple.app-sandbox.read;;;;/users/xiayuanquan/library/developer/coresimulator/devices/932eaed5-d4f5-41ee-a100-b59eb278796d/data/media/dcim/100apple/img_0006.jpg, AnyHashable("PHImageFileURLKey"): file:///Users/xiayuanquan/Library/Developer/CoreSimulator/Devices/932EAED5-D4F5-41EE-A100-B59EB278796D/data/Media/DCIM/100APPLE/IMG_0006.JPG, AnyHashable("PHImageResultDeliveredImageFormatKey"): 9999, AnyHashable("PHImageFileUTIKey"): public.jpeg, AnyHashable("PHImageFileOrientationKey"): 0, AnyHashable("PHImageResultOptimizedForSharing"): 0, AnyHashable("PHImageResultWantedImageFormatKey"): 9999, AnyHashable("PHImageResultIsPlaceholderKey"): 0, AnyHashable("PHImageResultIsInCloudKey"): 0])

五、完整的代码

//
// ViewController.swift
// PhotoKit
//
// Created by 夏远全 on 2017/2/26.
// Copyright © 2017年 夏远全. All rights reserved.
// import UIKit
import Photos
import PhotosUI /* 屏幕宽度 */
let screenWidth = UIScreen.main.bounds.width
/* 屏幕高度 */
let scrrenHeight = UIScreen.main.bounds.height class ViewController: UIViewController { override func viewDidLoad() {
super.viewDidLoad()
} //四、实例如下
//1、列出系统所有的相册,并获取每一个相册中的PHAsset对象
func fetchAllSystemAblum() -> Void {
let smartAlbums:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
print("智能\(smartAlbums.count)个") //smartAlbums中保存的是各个智能相册对应的PHAssetCollection
for i in ..<smartAlbums.count { //获取一个相册(PHAssetCollection)
let collection = smartAlbums[i] if collection.isKind(of: PHAssetCollection.classForCoder()) { //赋值
let assetCollection = collection //从每一个智能相册获取到的PHFetchResult中包含的才是真正的资源(PHAsset)
let assetsFetchResults:PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil) print("\(assetCollection.localizedTitle)相册,共有照片数:\(assetsFetchResults.count)") assetsFetchResults.enumerateObjects({ (asset, i, nil) in
//获取每一个资源(PHAsset)
print("\(asset)")
})
}
}
} //2、列出用户创建的相册,并获取每一个相册中的PHAsset对象,代码如下:
func fetchAllUserCreatedAlbum() -> Void {
let topLevelUserCollections:PHFetchResult = PHCollectionList.fetchTopLevelUserCollections(with: nil) //topLevelUserCollections中保存的是各个用户创建的相册对应的PHAssetCollection
print("用户创建\(topLevelUserCollections.count)个") for i in ...topLevelUserCollections.count { //获取一个相册(PHAssetCollection)
let collection = topLevelUserCollections[i]
if collection.isKind(of: PHAssetCollection.classForCoder()) { //类型强制转换
let assetCollection = collection as! PHAssetCollection //从每一个智能相册中获取到的PHFetchResult中包含的才是真正的资源(PHAsset)
let assetsFetchResults:PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil) print("\(assetCollection.localizedTitle)相册,共有照片数:\(assetsFetchResults.count)") assetsFetchResults.enumerateObjects({ (asset, i, nil) in
//获取每一个资源(PHAsset)
print("\(asset)")
})
}
}
} //3、获取所有资源的集合,并按资源的创建时间排序
func getAllSourceCollection() -> Array<PHAsset> { let options:PHFetchOptions = PHFetchOptions.init()
var assetArray = [PHAsset]()
options.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
let assetFetchResults:PHFetchResult = PHAsset.fetchAssets(with: options)
for i in ..<assetFetchResults.count {
//获取一个资源(PHAsset)
let asset = assetFetchResults[i] //添加到数组
assetArray.append(asset)
}
return assetArray
} //4、获取缩略图方法
func getAssetThumbnail(asset:PHAsset) -> Void { //获取缩略图
let manager = PHImageManager.default()
let option = PHImageRequestOptions() //可以设置图像的质量、版本、也会有参数控制图像的裁剪
option.isSynchronous = true
manager.requestImage(for: asset, targetSize: CGSize.init(width: screenWidth/, height: scrrenHeight/), contentMode: .aspectFit, options: option) { (thumbnailImage, info) in print("缩略图:\(thumbnailImage),图像信息:\(info)")
}
} //5、获取原图的方法
func getAssetOrigin(asset:PHAsset) -> Void { //获取原图
let manager = PHImageManager.default()
let option = PHImageRequestOptions() //可以设置图像的质量、版本、也会有参数控制图像的裁剪
option.isSynchronous = true
manager.requestImage(for: asset, targetSize:PHImageManagerMaximumSize, contentMode: .aspectFit, options: option) { (originImage, info) in print("原图:\(originImage),图像信息:\(info)")
}
}
}

Swift3.0:PhotoKit的使用的更多相关文章

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  2. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  3. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  4. swift3.0变化总结

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  5. 关于for循环------swift3.0

    在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...

  6. Swift2.3 --> Swift3.0 的变化

    Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...

  7. Swift3.0都有哪些变化

    从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...

  8. iOS开发 swift3.0中文版

    swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb

  9. swift3.0的改变

    Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github ...

  10. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

随机推荐

  1. Java动态性之反射机制(reflection)

    说到反射机制,第一次接触的人可能会比较懵,反射?什么反射?怎么反射?反射是干嘛的?下面我将在这篇文章中讲讲Java的反射机制 不过在这之前,还有一个问题需要解决,标题名中的动态性,说起动态性,我先介绍 ...

  2. Android - Bottom Navigation View

    目录 Android - Bottom Navigation View Android - Bottom Navigation View Overview 一直以来,关于Android的底部导航的功能 ...

  3. 开发人员如何正确对待BUG?

    ‌1.前端开发与后端开发 出了问题,最重要的是先找到方法迅速解决,而不是去互相指责.前端存在这样的思维模式,后端也存在这样的思维模式,这种思维模式不太好.出了问题,最好先检查一下自己,反省是不是自己这 ...

  4. 【HDU5909】Tree Cutting(FWT)

    [HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...

  5. 深刻领悟javascript中的exec与match方法之异同

    阅读本文之前,请先看下面一道题: 题目17:Read the following javascript code:  var someText="web2.0 .net2.0"; ...

  6. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A. Neverending competitions 水题

    A. Neverending competitions 题目连接: http://codeforces.com/contest/765/problem/A Description There are ...

  7. Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题

    C. Sonya and Queries 题目连接: http://codeforces.com/contest/714/problem/C Description Today Sonya learn ...

  8. [苹果]苹果AppStore应用审核标准

    [苹果]苹果AppStore应用审核标准 http://wenku.baidu.com/view/a9152d2c647d27284b7351a1.html   苹果app审核指南 http://we ...

  9. C#快速找出磁盘内的所有文件

    本文只针对NTFS格式化的磁盘文件快速检索,速度不是非常快,是让你震惊. 一般用文件遍历的方法检索一个50G的文件夹需要几十分钟甚至一个小时的时间,而用本方法只需几秒. using System; u ...

  10. 【Go入门教程2】基本构成元素:标识符(identifier)、关键字(keyword 25个)、字面量(literal)、分隔符(delimiter)、和 操作符(operator)

    基本构成要素 Go 的语言符号 又称 词法元素,共包括 5 类内容——标识符(identifier).关键字(keyword).字面量(literal).分隔符(delimiter) 和 操作符(op ...