swift 2.0 で変わったところ「後編」 #cswift

102
EZNET 熊友宏 http://eznet.jp/ 2015.09.26 @ カジュアル Swift 勉強会 #2 Swift 2.0 で変わったところ Swift カジュアルプログラミング (後編)

Upload: tomohiro-kumagai

Post on 09-Feb-2017

6.680 views

Category:

Software


0 download

TRANSCRIPT

  • EZ-NET http://ez-net.jp/

    2015.09.26 @ Swift #2

    Swift 2.0 Swift

  • EZ-NET http://ez-net.jp/ @es_kumagai

    Xcode 5

    IP Phone with

    MOSA

    #yidev iPhone Swift @

  • Swift 2.0 2015.09.16

  • Swift 2.0

  • http://www.slideshare.net/tomohirokumagai54/swift-20-cswift

    SlideShare

  • NSObject1/5

  • performSelector

  • Selector Objective-C

    performSelector

    func performSelector(sel: Selector) -> Unmanaged! func performSelector(sel: Selector, withObject obj: AnyObject!) -> Unmanaged! func performSelector(sel: Selector, withObject obj1: AnyObject!, withObject obj2: AnyObject!) -> Unmanaged!

  • Objective-C nil

    Selector

    struct Selector : StringLiteralConvertible, NilLiteralConvertible

  • performSelector

    let obj = NSString(string: "TEST.TXT")

    // ObjC NSString (NSObject) let extname:String = obj.performSelector("pathExtension") .takeRetainedValue()

  • performSelector

    let obj = NSString(string: "TEST.TXT")

    // ObjC NSString (NSObject) let extname:String = obj.performSelector( "componentsSeparatedByString:", withObject: "T") .takeRetainedValue()

  • performSelector

    let obj = NSString(string: "TEST.TXT")

    // NSInteger (long) nil let length:Int = obj.performSelector("length") .takeRetainedValue()

    Execution was interrupted, reason: EXC_BAD_ACCESS.

  • performSelector

    let obj = NSString(string: "TEST.TXT")

    // NSUInteger (unsigned long) let length:Int = obj.performSelector("characterAtIndex:", withObject: UInt(1)) .takeRetainedValue()

    Execution was interrupted, reason: signal SIGABRT.

    characterAtIndex: Range or index out of bounds.

  • performSelector

    let obj = NSString(string: "TEST.TXT")

    // NSNumber let length:Int = obj.performSelector("characterAtIndex:", withObject: NSNumber(unsignedInteger:1)) .takeRetainedValue()

    Execution was interrupted, reason: signal SIGABRT.

    characterAtIndex: Range or index out of bounds.

  • Swift performSelector

  • Swift performSelector

    class MyClass : NSObject {

    func toStringWithStr(v:String) -> String func toStringWithInt(v:Int) -> String

    }

  • performSelector

    let obj = MyClass()

    // String let result:String = obj.performSelector("toStringWithStr:", withObject: "A") .takeRetainedValue()

  • performSelector

    let obj = MyClass()

    // Int let result:String = obj.performSelector("toStringWithInt:", withObject: 1) .takeRetainedValue()

  • performSelector

    let obj = MyClass()

    // NSNumber let result:String = obj.performSelector("toStringWithInt:", withObject: NSNumber(integer:1)) .takeRetainedValue()

  • NSNumber OKperformSelector

    let obj = MyClass()

    // NSNumber let result:String = obj.performSelector("toStringWithNSNumber:", withObject: NSNumber(integer:1)) .takeRetainedValue()

  • NSNumber OKperformSelector

    let obj = MyClass()

    // NSNumber let result:String = obj.performSelector("toStringWithNSNumber:", withObject: 1) .takeRetainedValue()

  • Swift performSelector

  • Swift performSelector

    class MyClass : NSObject {

    func asString() -> String func asInt() -> Int

    }

  • performSelector

    let obj = MyClass()

    // String let value:String = obj.performSelector("asString") .takeRetainedValue()

  • performSelector

    let obj = MyClass()

    // Int let value:Int = obj.performSelector("asInteger") .takeRetainedValue()

    Execution was interrupted, reason: EXC_BAD_ACCESS.

  • Swift performSelectorObjC & Swift

  • Swift performSelector

    class MyClass : NSObject {

    func asObjC() -> ObjCClass func asNative() -> NativeClass }

    class ObjCClass : NSObject {

    }

    class NativeClass { }

  • ObjC performSelector

    let obj = MyClass()

    // ObjC AnyObject let result:AnyObject = obj.performSelector("asObjC") .takeRetainedValue()

    // let value:Int = (result as! ObjCClass).value

  • Swift performSelector

    let obj = MyClass()

    // Swift let value:Int = obj.performSelector("asNative") .takeRetainedValue()

    Execution was interrupted, reason: signal SIGABRT.

    asNative: unrecognized selector sent to instance.

  • performSelector

  • performSelector

  • performSelectorextension NSObject { func performSelectorOnMainThread( aSelector: Selector, withObject arg: AnyObject?, waitUntilDone wait: Bool)

    func performSelector( aSelector: Selector, onThread thr: NSThread, withObject arg: AnyObject?, waitUntilDone wait: Bool) func performSelectorInBackground( aSelector: Selector, withObject arg: AnyObject?) }

  • @objc

  • ObjC Swift NSObject

    @objc

    ObjC Swift NSObject

  • // NSObject @objc class SwiftClass {

    }

    // NSObject @objc class SwiftClass : NSObject {

    }

    Only classes that inherit from NSObject can be declared @objc

    @objc class

  • // ObjC @objc protocol MyProtocol {

    }

    // protocol MyProtocol {

    }

    @objc protocol

  • // @objc protocol MyProtocol {

    func method() }

    // @objc @objc class SwiftClass : MyProtocol {

    @objc func method() }

    @objc protocol

  • @nonobjc

  • Objective-C

    @nonobjc

    class SwiftClass : NSObject { var value:Int

    @nonobjc var native:Int @objc var compatible:Int }

  • @nonobjc

    SwiftClass* instance = [[SwiftClass alloc] init];

    // @nonobjc instance.value

  • 2/5

  • #available

  • #available

    // #available(*)

    // OSX 10.10 #available(OSX 10.10, *)

    // OSX 10.10 iOS 8.4 // #available(OSX 10.10, iOS 8.4, *)

  • if #available

    if #available(OSX 10.10, *) {

    // OSX 10.10

    } else {

    // OSX 10.10

    }

  • else if #available

    if #available(OSX 10.9, *) {

    // OSX 10.9

    } else if #available(OSX 10.10, *) {

    // OSX 10.9

    } else {

    // OSX 10.9

    }

  • #available

    if #available(iOS 9.0, *) && value == 1 {

    } Expected { after if condition

  • #available

    // Deployment Target iOS 9.0 if #available(iOS 9.0, *) {

    }

    Unnecessary check for iOS; minimum deployment target ensures guard will always be true

  • guard #available

    guard #available(OSX 10.10, *) else {

    // Exit

    }

    // OSX 10.10 //

  • #available

    * iOS iOSApplicationExtension OSX OSXApplicationExtension watchOS watchOSApplicationExtension

  • Error Handling3/5

    Beta 5

  • Error Type

  • Error Type

    // struct FileOperationError : ErrorType {

    }

    ErrorType 1

  • Error Type

    // struct FileOperationError : ErrorType {

    var _code:Int var _domain:String }

    _code _domain

  • Error Type

    // throw FileOperationError()

  • rethrows

  • rethrows rethrows

    func map( transform: (Generator.Element) throws -> T ) rethrows -> [T]

    func reduce( initial: T, combine: (T, Generator.Element) throws -> T ) rethrows -> T

    func filter( element: (Generator.Element) throws -> Bool ) rethrows -> [Generator.Element]

  • rethrows rethrows

    func &&( lhs: T, @autoclosure rhs: () throws -> U ) rethrows -> Bool

    func ||( lhs: T, @autoclosure rhs: () throws -> U ) rethrows -> Bool

    func ??( optional: T?, @autoclosure defaultValue: () throws -> T ) rethrows -> T

  • try?

  • try?

    var handle:Handle? = try? File.open(path)

    nil

  • try?

    // var handle:Handle?

    do {

    // handle = try File.open(path)

    } catch {

    // nil handle = nil }

  • guard try?

    guard let handle = try? File.open(path) else {

    // Exit return

    }

    // return readFrom(handle)

  • rethrows try?

    // nil let sum:Int? = try? objects.reduce(0) {

    try $0 + $1.toInt() }

    // let sum:Int? = try? objects .map { try $0.toInt() } .reduce(0, combine: +)

  • 4/5

  • //

    count(array)

    map(array) { $0 }

    // extension CollectionType {

    var count: Index.Distance { get }

    func map(f:(Generator.Element)->T)->[T]

    }

  • // Swift 1

    count(array)

    map(array) { $0 }

    // Swift 2

    array.count

    array.map { $0 }

  • // toString

    let string = toString(value)

    // String

    let string = String(value)

    toString

  • Swift 1.x 3

    Swift 2.0 2

  • // func getPrice(price:Int, tax:Double) -> Int

    // Swift 1 getPrice(100, 0.05)

    // Swift 2 getPrice(100, tax: 0.05)

  • #

    func getPrice(#price:Int) -> Int

    func getPrice(price price:Int) -> Int

    '#' has been removed from Swift; double up 'price price' to make the argument label the same as the parameter name

  • _

    _

    _ _ _

  • func action(a:Int, b:Int = 1, c:Int = 2) { }

    // value.action

  • forEach

  • forEach

    extension SequenceType {

    func forEach( @noescape body:(Generator.Element) throws -> () ) rethrows }

    for in

  • forEach

    items.filter(isValid).forEach {

    $0.activate() }

    break continue return for in

  • // func writeTo( path:String, items:String..., permit:Int ) {

    }

    // writeTo(path, items:"A","B","C", permit:0o775)

  • // func writeTo( path:String, items:String..., permit:Int = 0o755) {

    }

    // writeTo(path, items:"A","B","C")

  • // func writeTo( path:String, items:String..., preAction:(String) -> String) {

    }

    // writeTo(path, items:"A","B","C") {

    return parseItem($0) }

  • // func writeTo( path:String, items:String..., permits:Int...) {

    } Only a single variadic parameter '...' is permitted

  • struct MyType { //

    init?(string: String) { } //

    init?(resource:String) {

    // self.init(string: readFrom(resource)) } } nil

  • struct MyType { //

    init?(string: String) { } //

    init() {

    // self.init(string: "DEFAULT")! } }

  • let strings = ["10", "3.5", "8", "20.8"]

    // let values = strings.flatMap(Double.init)

  • struct Selector : StringLiteralConvertible {

    init(_ str: String) init(stringLiteral value: String) }

    // let sel = optionalString.map(Selector.init)

    Ambiguous reference to member Selector.init

  • Swift 2

  • let string = "New in Swift 2.0"

    // string.containsString("Swift")

    // String.containsString(string)("Swift")

  • // let sorted = letters .filter { string.containsString($0) } .sort { $0 > $1 }

    // let sorted = letters .filter(String.containsString(string)) .sort(>)

  • 5/5

  • indirect case

  • // enum Cascade { indirect case Device(String, next:Cascade) case Terminate }

    indirect case

    // let devices:Cascade = .Device("HDD", next: .Device("DVD", next: .Device("MO", next: .Terminate)))

    indirect case

  • indirect case

    extension Cascade { var depth:Int { switch self { case .Device(_, next: let next): return 1 + next.depth case .Terminate: return 0 } } }

    // devices.depth

  • Raw

  • // enum Language : String { case Swift case ObjectiveC = "Objective-C" case C case Ruby }

    // Language.Swift.rawValue

    Raw

    OK

  • Swift 2.0

    NSObject Error Handling

    Error Handling Extension