一、介绍

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 Socket实战之一 单线程通信基础socket

    现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用spring,其中就可以支持很多种远程连接的操作,另外jboss的remoting也是不错的选择,还有Apache ...

  2. react初始化阶段

    初始化阶段可以使用的函数:getDefaultProps:只调用一次,实例之间共享引用.只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始 ...

  3. 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一 ...

  4. span 居中

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha ====== 把span 升级为块级元素,div 的宽度.然后使用定位,添加 text- ...

  5. 使用清华源和阿里源替代Ubuntu源

    sudo nano /etc/apt/source.list 替换为如下文本 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors. ...

  6. JNI之String类型

    JNI使用的是改良的UTF-8格式的Strings. 以下文档来自官方: Modified UTF-8 Strings The JNI uses modified UTF-8 strings to r ...

  7. Driving proportional valves from microcontroller

    Driving proportional valves from microcontroller I am looking to drive a current regulated proportio ...

  8. ARM Cortex Design Considerations for Debug

    JTAG was the traditional mechanism for debug connections for ARM7/9 parts, but with the Cortex-M fam ...

  9. Understanding the STM32F0's GPIO

    Understanding the STM32F0's GPIO This is the first part of the GPIO tutorial for the STM32F0Discover ...

  10. hdu 2546 饭卡(背包)

      设饭卡余额为total 此题经分析 可以得出:要求选出一些饭菜 时消费量尽量接近total-5元 然后再买一个饭菜 以达到透支... 可以证明 最后买的那个饭菜是饭菜中价值最大的. 证明 设a1 ...