Swift 3.1 簡(jiǎn)明代碼

init() { /* ... */ }
init(frame: CGRect, style: UITableViewStyle) { /* ... */ }
let myTableView: UITableView = UITableView(frame: .zero, style: .grouped)
let myTextField = UITextField(frame: CGRect(x: 0.0, y: 0.0, width: 200.0, height: 40.0))
let color = UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0)

用 if let 對(duì)可選值進(jìn)行有值綁定

if let image = UIImage(contentsOfFile: "MyImage.png") {

// loaded the image successfully

} else {

// could not load the image

}
myTextField.textColor = .darkGray

myTextField.text = "Hello world”

myTableView.insertSubview(mySubview, at: 2)

如果你調(diào)用的方法是沒(méi)有參數(shù)的,調(diào)用時(shí)也得加上在點(diǎn)方法后也得加上括號(hào)

myTableView.layoutIfNeeded()
var x: Any = "hello" as String

x as? String // String with value "hello"

x as? NSString // NSString with value "hello"

x = "goodbye" as NSString

x as? String // String with value "goodbye"

x as? NSString // NSString with value "goodbye"
let userDefaults = UserDefaults.standard

let lastRefreshDate = userDefaults.object(forKey: "LastRefreshDate") // lastRefreshDate is of type Any?

if let date = lastRefreshDate as? Date {

print("\(date.timeIntervalSinceReferenceDate)")

}

如果你確定類(lèi)型,可強(qiáng)制解包

let myDate = lastRefreshDate as! Date

let timeInterval = myDate.timeIntervalSinceReferenceDate

如果類(lèi)型不匹配,就會(huì)出現(xiàn)錯(cuò)誤

let myDate = lastRefreshDate as! String // Error
var nullableProperty: Any? // 可選值,可空和必有值兩種情況

var nonNullProperty: Any // 必有值

var unannotatedProperty: Any! // 未知

func returnsNonNullValue() -> Any // 必有返回值

func takesNonNullParameter(value: Any) // 參數(shù)必有值

func returnsNullableValue() -> Any? //可選值的返回值

func takesNullableParameter(value: Any?) 可選值的參數(shù)

func returnsUnannotatedValue() -> Any! // 未知返回

func takesUnannotatedParameter(value: Any!) 未知參數(shù)
var dates: [Date]

var cachedData: NSCache<AnyObject, NSDiscardableContent>

var supportedLocales: [String: [Locale]]

class List<T: NSCopying> : NSObject {

func listByAppendingItemsInList(otherList: List<T>) -> List<T>

}

class ListContainer : NSObject {

func listOfValues() -> List<NSValue>

}

extension ListContainer {

func listOfObjects() -> List<NSCopying>

}

extension

extension UIBezierPath {

convenience init(triangleSideLength: CGFloat, origin: CGPoint) {

self.init()

let squareRoot = CGFloat(sqrt(3.0))

let altitude = (squareRoot * triangleSideLength) / 2

move(to: origin)

addLine(to: CGPoint(x: origin.x + triangleSideLength, y: origin.y))

addLine(to: CGPoint(x: origin.x + triangleSideLength / 2, y: origin.y + altitude))

close()

}

}

extension CGRect {

var area: CGFloat {

return width * height

}

}

let rect = CGRect(x: 0.0, y: 0.0, width: 10.0, height: 50.0)

let area = rect.area

OC的block,Swift的閉包c(diǎn)losures

void (^completionBlock)(NSData *) = ^(NSData *data) {

// ...

}

let completionBlock: (Data) -> Void = { data in

// ...

}

解決循環(huán)引用問(wèn)題的處理

__weak typeof(self) weakSelf = self;

self.block = ^{

__strong typeof(self) strongSelf = weakSelf;

[strongSelf doSomething];

};

self.closure = { [unowned self] in

self.doSomething()

}

類(lèi)定義

class Jukebox: NSObject {

var library: Set<String>

var nowPlaying: String?

var isCurrentlyPlaying: Bool {

return nowPlaying != nil

}

class var favoritesPlaylist: [String] {

// return an array of song names

}

init(songs: String...) {

self.library = Set<String>(songs)

}

func playSong(named name: String) throws {

// play song or throw an error if unavailable

}

}

NOTE
You cannot subclass a Swift class in Objective-C. 你不能用OC來(lái)實(shí)現(xiàn)一個(gè)Swift的子類(lèi)

import UIKit

class MyViewController: UIViewController {

let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))

override init?(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {

super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

let action = #selector(MyViewController.tappedButton)

myButton.addTarget(self, action: action, forControlEvents: .touchUpInside)

}

func tappedButton(sender: UIButton?) {

print("tapped button")

}

required init?(coder: NSCoder) {

super.init(coder: coder)

}

}
let string: NSString = "Hello, Cocoa!"

let selector = #selector(NSString.lowercased(with:))

let locale = Locale.current

if let result = string.perform(selector, with: locale) {

print(result.takeUnretainedValue())

}

// Prints "hello, cocoa!"

let array: NSArray = ["delta", "alpha", "zulu"]

// Not a compile-time error because NSDictionary has this selector.

let selector = #selector(NSDictionary.allKeysForObject)

// Raises an exception because NSArray does not respond to this selector.

array.perform(selector)

@objc(Color) OC能訪問(wèn)得到這個(gè)Swift類(lèi)

@objc(Color)

enum Цвет: Int {

@objc(Red)

case Красный

@objc(Black)

case Черный

}

@objc(Squirrel)

class Белка: NSObject {

@objc(color)

var цвет: Цвет = .Красный

@objc(initWithName:)

init (имя: String) {

// ...

}

@objc(hideNuts:inTree:)

func прячьОрехи(количество: Int, вДереве дерево: Дерево) {

// ...

}

}
class Person: NSObject {

var name: String

var friends: [Person] = []

var bestFriend: Person? = nil

init(name: String) {

self.name = name

}

}

let gabrielle = Person(name: "Gabrielle")

let jim = Person(name: "Jim")

let yuanyuan = Person(name: "Yuanyuan")

gabrielle.friends = [jim, yuanyuan]

gabrielle.bestFriend = yuanyuan

#keyPath(Person.name)

// "name"

gabrielle.value(forKey: #keyPath(Person.name))

// "Gabrielle"

#keyPath(Person.bestFriend.name)

// "bestFriend.name"

gabrielle.value(forKeyPath: #keyPath(Person.bestFriend.name))

// "Yuanyuan"

#keyPath(Person.friends.name)

// "friends.name"

gabrielle.value(forKeyPath: #keyPath(Person.friends.name))

// ["Yuanyuan", “Jim”]

用Swift來(lái)定義一個(gè)OC類(lèi)的子類(lèi)

import UIKit

class MySwiftViewController: UIViewController {

// define the class

}

遵守協(xié)議

class MySwiftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

// define the class

}
let myPersonClass: AnyClass? = NSClassFromString("MyGreatApp.Person”)

托線操作

class MyViewController: UIViewController {

// 屬性托線

@IBOutlet weak var button: UIButton!

@IBOutlet var textFields: [UITextField]!

// 事件托線

@IBAction func buttonTapped(sender: AnyObject) {

print("button tapped!")

}

}

IB可視化操作,實(shí)踐了下感覺(jué)如果電腦反應(yīng)不快,會(huì)卡得慌,于是就沒(méi)有用了,不過(guò)很是方便

@IBDesignable

class MyCustomView: UIView {

@IBInspectable var textColor: UIColor

@IBInspectable var iconHeight: CGFloat

// ...

}

定義協(xié)議

import UIKit

@objc protocol MyCustomProtocol {

var people: [Person] { get }

func tableView(_ tableView: UITableView, configure cell: UITableViewCell, forPerson person: Person)

@objc optional func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forPerson person: Person)

}

OC對(duì)象也能遵守實(shí)現(xiàn)這個(gè)協(xié)議

@interface MyCustomController: UIViewController <MyCustomProtocol>

@property (nonatomic, strong) NSArray<Person *> *people;

@end

@implementation MyCustomController

@synthesize people;

- (void)tableView:(UITableView *)tableView

configure:(UITableViewCell *)cell

forPerson:(Person *)person

{

// Configure cell

}

@end

與Cocoa Frameworks進(jìn)行操作

import Foundation

let string: String = "abc"

let bridgedString: NSString = string as NSString

let stringLiteral: NSString = "123"

if let integerValue = Int(stringLiteral as String) {

print("\(stringLiteral) is the integer \(integerValue)")

}

// Prints "123 is the integer 123"

import Foundation

let number = 42

let bridgedNumber: NSNumber = number as NSNumber

let integerLiteral: NSNumber = 5

let floatLiteral: NSNumber = 3.14159

let booleanLiteral: NSNumber = true

lazy loading
直接創(chuàng)建的對(duì)象

lazy var XML: XMLDocument = try! XMLDocument(contentsOf: Bundle.main.url(forResource: "document", withExtension: "xml")!, options: 0)

var pattern: String

lazy var regex: NSRegularExpression = try! NSRegularExpression(pattern: self.pattern, options: [])

創(chuàng)建完一個(gè)對(duì)象,還需要對(duì)它進(jìn)行特別屬性設(shè)置的時(shí)候,這樣寫(xiě)

lazy var currencyFormatter: NumberFormatter = {

let formatter = NumberFormatter()

formatter.numberStyle = .currency

formatter.currencySymbol = "¤"

return formatter

}()

NOTE

假如這個(gè)屬性還沒(méi)有加載,并且被多個(gè)線程同時(shí)訪問(wèn),那么不能保證這個(gè)屬性真的只初始化一次

對(duì)于 異常的處理

let fileManager = FileManager.default

let fromURL = URL(fileURLWithPath: "/path/to/old")

let toURL = URL(fileURLWithPath: "/path/to/new")

do {

try fileManager.moveItem(at: fromURL, to: toURL)

} catch let error as NSError {

print("Error: \(error.domain)")

}

do {

try fileManager.moveItem(at: fromURL, to: toURL)

} catch CocoaError.fileNoSuchFile {

print("Error: no such file exists")

} catch CocoaError.fileReadUnsupportedScheme {

print("Error: unsupported scheme (should be 'file://')")

}

代碼對(duì)比,精簡(jiǎn)了很多下面

NSFileManager *fileManager = [NSFileManager defaultManager];

NSURL *tmpURL = [fileManager URLForDirectory:NSCachesDirectory

inDomain:NSUserDomainMask

appropriateForURL:nil

create:YES

error:nil];

if (tmpURL != nil) {

// ...

}
let fileManager = FileManager.default

if let tmpURL = try? fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) {

// ...

}

KVO
使用關(guān)鍵字 dynamic 字來(lái)修飾你想要監(jiān)聽(tīng)變化的這個(gè)屬性

class MyObjectToObserve: NSObject {

dynamic var myDate = NSDate()

func updateDate() {

myDate = NSDate()

}

}

寫(xiě)一個(gè)全局的變量來(lái)記錄對(duì)比操作

private var myContext = 0

在需要開(kāi)啟監(jiān)聽(tīng)的地方監(jiān)聽(tīng),然后重寫(xiě)這個(gè)方法 observeValue(for:of:change:context:)
還有一點(diǎn)很重要,對(duì)象銷(xiāo)毀時(shí)在方法 deinit移除監(jiān)聽(tīng)

class MyObserver: NSObject {

var objectToObserve = MyObjectToObserve()

override init() {

super.init()

objectToObserve.addObserver(self, forKeyPath: #keyPath(MyObjectToObserve.myDate), options: .new, context: &myContext)

}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

if context == &myContext {

if let newValue = change?[.newKey] {

print("Date changed: \(newValue)")

}

} else {

super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)

}

}

deinit {

objectToObserve.removeObserver(self, forKeyPath: #keyPath(MyObjectToObserve.myDate), context: &myContext)

}

}

單例的寫(xiě)法

class Singleton {

static let sharedInstance = Singleton()

}

如果你需要做些額外的事情 ,可以還這樣寫(xiě)

class Singleton {

static let sharedInstance: Singleton = {

let instance = Singleton()

// setup code

return instance

}()

}

對(duì)于 OC isKindOfClass還有confirmsToProtocal可以用is as?來(lái)處理

if object is UIButton {

// object is of type UIButton

} else {

// object is not of type UIButton

}

if let button = object as? UIButton {

// object is successfully cast to type UIButton and bound to button

} else {

// object could not be cast to type UIButton

}

if let dataSource = object as? UITableViewDataSource {

// object conforms to UITableViewDataSource and is bound to dataSource

} else {

// object not conform to UITableViewDataSource

}

自動(dòng)釋放池的運(yùn)用

import Foundation

autoreleasepool {

// code that creates autoreleased objects.

}

方法可用性的檢測(cè)

if ([CLLocationManager instancesRespondToSelector:@selector(requestWhenInUseAuthorization)]) {

// Method is available for use.

} else {

// Method is not available.

}

let locationManager = CLLocationManager()

if #available(iOS 8.0, macOS 10.10, *) {

locationManager.requestWhenInUseAuthorization()

}

let locationManager = CLLocationManager()

guard #available(iOS 8.0, macOS 10.10, *) else { return }

locationManager.requestWhenInUseAuthorization()

你也可以定義一個(gè)特別的方法在特別的版下特別的平臺(tái)下運(yùn)行

@available(iOS 8.0, macOS 10.10, *)

func useShinyNewFeature() {

// ...

}

條件編譯

#if DEBUG_LOGGING

print("Flag enabled.")

#endif

#if arch(arm) || arch(arm64)

#if swift(>=3.0)

print("Using Swift 3 ARM code")

#else

print("Using Swift 2.2 ARM code")

#endif

#elseif arch(x86_64)

print("Using 64-bit x86 code.")

#else

print("Using general code.")

#endif

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,328評(píng)論 4 61
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 UI下拉刷新模糊效果A...
    袁俊亮技術(shù)博客閱讀 12,146評(píng)論 9 105
  • 現(xiàn)今說(shuō)道游戲,不是手游就是網(wǎng)游??晌易钕矚g的游戲很土的,從小到大都喜歡玩拼圖!而且一定要是紙質(zhì)的小塊的慢慢拼,片數(shù)...
    汽球閱讀 480評(píng)論 0 0
  • “一帶一路”奇石上“母親回眸圖” 在參軍到新疆之時(shí),師父送給我...
    帶路神圖閱讀 374評(píng)論 0 0
  • 2.1操作系統(tǒng)的目標(biāo)和功能 操作系統(tǒng)提供以下幾方面的服務(wù) 程序開(kāi)發(fā)擦做系統(tǒng)提供各種各樣的工具和服務(wù)。幫助程序員開(kāi)發(fā)...
    Myth52125閱讀 505評(píng)論 0 0

友情鏈接更多精彩內(nèi)容