Share
Embed
Swift3.0の破壊的メジャーアップデートの内容をみてみよう
【朝活】iOS開発会議62回目in 株式会社トライフォート
https://www.facebook.com/events/269576500054423/
の発表内容
Swift3.0のアップデート内容を共有しました。
Sato Takeshi
May 19, 2016
Transcript
52 slides
-
Өڹେͳมߋ5બ • SE-0005 • SE-0044 • SE-0055 • SE-0057 •
SE-0072 Swiftϓϩάϥϛϯάษڧձ 2016/5/19 19 -
SE-0005 Objective-C APIΛSwiftʹม͢Δ ΑΓྑ͍ํ๏ • Objective-CͷAPIΛSwiftʹΠϯϙʔτ͢Δ͍͞ͷ໋໊نଇΛมߋ͢ΔϚο νϯάํ๏Λهࡌ • Objecitve-CϑϨʔϜϫʔΫΛ༻ͨ͋͠Γͱ͋ΒΏΔطଘͷSwiftίʔυʹ ӨڹΛ༩͑Δɻ
• ͪͳΈʹFoundation͕Objective-CΛݺΜͰ͍ΔͷͰطଘίʔυશ͕ͯର ʂ • Swift2ͷίʔυ͔ΒSwift3ม͢ΔϚΠάϨʔγϣϯπʔϧ͕ඞཁ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 20 -
ྫ͑ɺSwift2.2·Ͱ͜Μͳίʔυ class UIBezierPath : NSObject, NSCopying, NSCoding { convenience init(ovalInRect:
CGRect) func moveToPoint(_: CGPoint) func addLineToPoint(_: CGPoint) func addCurveToPoint(_: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint) func addQuadCurveToPoint(_: CGPoint, controlPoint: CGPoint) func appendPath(_: UIBezierPath) func bezierPathByReversingPath() -> UIBezierPath func applyTransform(_: CGAffineTransform) var empty: Bool { get } func containsPoint(_: CGPoint) -> Bool func fillWithBlendMode(_: CGBlendMode, alpha: CGFloat) func strokeWithBlendMode(_: CGBlendMode, alpha: CGFloat) func copyWithZone(_: NSZone) -> AnyObject func encodeWithCoder(_: NSCoder) } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 21 -
Swift3.0͜ΜͳίʔυʹͳΔ class UIBezierPath : NSObject, NSCopying, NSCoding { convenience init(ovalIn
rect: CGRect) func move(to point: CGPoint) func addLine(to point: CGPoint) func addCurve(to endPoint: CGPoint, controlPoint1 controlPoint1: CGPoint, controlPoint2 controlPoint2: CGPoint) func addQuadCurve(to endPoint: CGPoint, controlPoint controlPoint: CGPoint) func append(_ bezierPath: UIBezierPath) func reversing() -> UIBezierPath func apply(_ transform: CGAffineTransform) var isEmpty: Bool { get } func contains(_ point: CGPoint) -> Bool func fill(_ blendMode: CGBlendMode, alpha alpha: CGFloat) func stroke(_ blendMode: CGBlendMode, alpha alpha: CGFloat) func copy(with zone: NSZone = nil) -> AnyObject func encode(with aCoder: NSCoder) } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 22 -
SE-0044 Objective-C APIΛΑΓSwiftyʹ͢ Δ • CݴޠͷએݴΛΠϯϙʔτ͢Δ͍͞ʹΑΓSwiftΒ͍͠ͷʹ ͳΔΑ͏ʹΠϯϙʔτํ๏Λมߋ͢Δ • CݴޠϑϨʔϜϫʔΫΛΠϯϙʔτ͍ͯ͠ΔSwiftϓϩδΣΫ τେنͳӨڹΛड͚ΔɻϚΠάϨʔγϣϯπʔϧͰӨڹ
ΛܰݮͰ͖·͢ɻ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 23 -
ྫ͑Core Graphics C API: Swift2.2·Ͱ override func drawRect(rect: CGRect) {
let context: CGContext = UIGraphicsGetCurrentContext()! let toCenter = CGPoint(x: bounds.width/2.0, y: bounds.height/2.0) let angle = CGFloat(M_PI / 16) var transform = CGAffineTransformIdentity for _ in 0..<32 { triangulateRect(bounds, inputTransform: transform, context: context) transform = CGAffineTransformTranslate(transform, toCenter.x, toCenter.y) transform = CGAffineTransformRotate(transform, angle) transform = CGAffineTransformTranslate(transform, -toCenter.x, -toCenter.y) } CGContextSetLineWidth(context, bounds.size.width / 100) CGContextSetGrayStrokeColor(context, 0.5, 1.0) CGContextDrawPath(context, .Stroke) } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 24 -
ྫ͑Core Graphics C API: Swift3.0͔Β override func drawRect(rect: CGRect) {
let context: CGContext = UIGraphicsGetCurrentContext()! let toCenter = CGPoint(x: bounds.width/2.0, y: bounds.height/2.0) let angle = CGFloat(M_PI / 16) var transform = CGAffineTransform.identity for _ in 0..<32 { triangulateRect(bounds, inputTransform: transform, context: context) transform = transform.translate(toX: toCenter.x, toY: toCenter.y) .rotate(angle: angle) .translate(toX: -toCenter.x, toY: -toCenter.y) } context.lineWidth = bounds.size.width / 100 context.strokeColor = CGColor(gray: 0.5, alpha: 1.0) context.drawPath(mode: .Stroke) } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 25 -
SE-0055 ҆શͰͳ͍ϙΠϯλʔͷnullՄೳੑ ΛΦϓγϣφϧܕʹ͢Δ • Objective-CͷϙΠϯλʹΦϒδΣΫτͰ͋ΕɺඇΦϒδΣΫτͰ͋Ε nullable͔nonnullଐੑΛ͚ͭΒΕΔɻ • SwiftඇΦϒδΣΫτͷϙΠϯλUnsafePointer<Int>͕nullʹͳΔ͔Ͳ͏ ͔ͷ۠ผ͕͚ͭΒΕͳ͍ɻ •
ͳͷͰɺnullʹͳΔՄೳੑͷ͋ΔϙΠϯλΛΦϓγϣφϧܕʹ͠ UnsafePointer<Int>?ͷΑ͏ʹఆٛΛ͢Δɻ • ͋ΒΏΔϙΠϯλܕӨڹΛड͚Δ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 26 -
SE-0057 Objecitive-CʹܰྔδΣωϦΫεΛΠ ϯϙʔτ͢Δ • Objective-CͷܰྔδΣωϦΫεػೳΛಋೖͯ͠ɺίϨΫγϣϯܕΛѻ͏࣌ ͷObjevecive-CͷΫϥεΛSwiftʹΠϯϙʔτͨ͠ࡍʹͦͷ··ͷܕͰΠϯ ϙʔτͰ͖ΔΑ͏ʹ͢Δ • ݱঢ়AnyObjectʹͳ͍ͬͯͨɻ •
NSArray<NSString *> * ΛΠϯϙʔτͨ͠ࡍʹ[String]ʹͳΔΑ͏ʹͳΔɻ • Ҿͳ͠ͰObjective-CͷίϨΫγϣϯܕΛఆ͍ٛͯ͠ΔίʔυӨڹΛड ͚Δɻ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 27 -
ӨڹΛड͚Δίʔυ let array: NSArray = ["hello", "world"] // okay, infer
NSArray<NSString> // old var mutArray = NSMutableArray() // error: need type arguments for NSMutableArray Swiftϓϩάϥϛϯάษڧձ 2016/5/19 28 -
SE-0072 Swift͔Βͷ҉ͷϒϦοδมΛ શʹͳ͘͢ • Swift1.2Ͱ҉ͷϒϦοδมΛͳ͚ͨ͘͠ͲɺObjective-CͷAPIͰ ऍ͕͋Δ߹ͳͯ͘͠ͳ͔ͬͨɻSwift3ͰͦΕશʹফ͠· ͢ɻ • Objective-CͷAPI໌ࣔతʹΩϟετ͠ͳ͍͚ͯ͘ͳ͘ͳΓ· ͢ɻ
• ҉ʹΩϟετ͍ͯͨ͠ίʔυasΛ͔ͭͬͯͷΩϟετ͕ඞཁͰ͢ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 29 -
SE-0002: ؔఆٛͰͷΧϦʔԽจ๏ͷআ Θ͔Γʹ͍͘ΜͰআ // Before: func curried(x: Int)(y: String) ->
Float { return Float(x) + Float(y)! } // After: func curried(x: Int) -> (String) -> Float { return {(y: String) -> Float in return Float(x) + Float(y)! } } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 31 -
SE-0003: ؔͷҾͰͷvarΛআ ؔҾͰvarΛఆٛͯ͠Ҿมߋ͕Ͱ͖ͳ͘ͳΔ //for swift2.2 func foo(var i: Int) {
i += 1 // OK, but the caller cannot observe this mutation. } //for swift3.0 func foo(i: Int) { i += 1 // illegal } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 32 -
SE-0053: ؔͷҾͰͷ໌ࣔతletΛ আ ؔͷҾมߋͰ͖ͳ͘ͳΔ func foo(let x: Int) { ...
}// not work! func foo(x: Int) { ... }// fine! Swiftϓϩάϥϛϯάษڧձ 2016/5/19 33 -
SE-0004: ++,--ΦϖϨʔλͷআ CݴޠͰΘΕͨ++,--ΦϖϨʔλSwiftͰସखஈ͕๛ Ͱɺҙຯ͕ͳ͍ʹ͔͔ΘΒͣແ༻ͳޡղΛੜΉॻ͖ํͳͷͰ আ x += 1 ·ͨΠϯσοΫεܕͰ x
= x.successor() ʹมߋ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 34 -
SE-0007: CݴޠελΠϧͷforจͷ আ Cݴޠͷforจ[ྫʀfor(var i = 1; i < 10;
i++ʣ]Swiftͬ Ά͘ͳ͍ͷͰআ for-inจΛ͓͏ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 35 -
SE-0029: ؔҾΛλϓϧͰද͢จ๏Λআ ؔͷҾΛλϓϧͰ͔͚ΔγϯλοΫεγϡΨʔ͕͋ͬͨΜ ͚ͩͲɺҙຯͳ͍ΜͰআ͠·͢ ͜ͷॻ͖ํ͕Ͱ͖ͳ͘ͳΔ func foo(a : Int, b
: Int) {} let x = (1, b: 2) foo(x) Swiftϓϩάϥϛϯάษڧձ 2016/5/19 36 -
SE-0031: inoutଐੑͷҐஔͷมߋ inoutଐੑͷҐஔ͕:ͷޙͰɺҾͷܕͷલʹҠಈ͠·ͨ͠ɻ //for swift2.2 func foo(inout x: Int) {
} //for swift3.0 func foo(x: inout Int) { } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 37 -
SE-0043: caseจʹ͓͚ΔෳύλʔϯΛಉ࣌ ʹຬͨ͢มΛఆٛ enum MyEnum { case Case1(Int,Float) case Case2(Float,Int)
} switch value { case let .Case1(x, 2), let .Case2(2, x): print(x) case .Case1, .Case2: break } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 38 -
SE-0025: ΞΫηε੍ݶͷείʔϓ ͍··Ͱprivate͕ϑΝΠϧ୯ҐͷΞΫηε੍ݶͩͬͨͷΛείʔϓ୯Ґʹมߋ͠· ͢ʂ ΞΫηε੍ݶͷम০ࢠҎԼͷ̐ͭʹͳΓ·͢ • public: ݱࡏͷϞδϡʔϧͷ֎Ͱݟ͑Δम০ࢠ • internal:
ݱࡏͷϞδϡʔϧͷதͰݟ͑Δम০ࢠ • fileprivate: ݱࡏͷϑΝΠϧͰݟ͑Δम০ࢠ • private: ݱࡏͷείʔϓͷΈʹݟ͑Δम০ࢠ private͕ϑΝΠϧ୯ҐͰͳ͘είʔϓ୯ҐʹͳΔʂ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 40 -
ίʔυྫ class A { private var counter = 0 //
internalͷύϒϦοΫAPI func incrementCount() { ++counter } // ͜ͷείʔϓ͔Β֎͔Βݟ͑ͳ͍API private func advanceCount(dx: Int) { counter += dx } // incrementTwice() is not visible here } extension A { // counterϓϩύςΟ͔͜͜Βݟ͑ͳ͍ɻ // advanceCount() ϝιου͔͜͜Βݟ͑ͳ͍ // extensionͰଞ͔Βݟ͑ͳ͍ϝιουΛ࣮͢Δͷ༗ӹͳ߹͕͋Δɻ // incrementTwice()ϝιου͜ͷextensionΑΓ֎Ͱίʔυิ͕͞Εͳ͍ private func incrementTwice() { incrementCount() incrementCount() } } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 41 -
ྫ͑HealthKit identifiersObjecitve-CͰ ͜Μͳײ͡ʹఆٛͯ͠ typedef NSString * HKQuantityTypeIdentifier __attribute__((swift_wrapper(enum)); HK_EXTERN HKQuantityTypeIdentifier
const HKQuantityTypeIdentifierBodyMassIndex; HK_EXTERN HKQuantityTypeIdentifier const HKQuantityTypeIdentifierBodyFatPercentage; HK_EXTERN HKQuantityTypeIdentifier const HKQuantityTypeIdentifierHeight; HK_EXTERN HKQuantityTypeIdentifier const HKQuantityTypeIdentifierBodyMass; HK_EXTERN HKQuantityTypeIdentifier const HKQuantityTypeIdentifierLeanBodyMass; Swiftϓϩάϥϛϯάษڧձ 2016/5/19 45 -
Swiftଆ͜Μͳײ͡ʹenumͰม͞ΕΔ enum HKQuantityTypeIdentifier : String { case BodyMassIndex case BodyFatPercentage
case Height case BodyMass case LeanBodyMass } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 46 -
NSError͜Μͳײ͡ʹObjective-Cʹఆٛ͞Ε ͍ͯΔͱ͖ typedef NSString * NSErrorDomain __attribute__((swift_wrapper(struct))); FOUNDATION_EXPORT NSErrorDomain const
NSCocoaErrorDomain; FOUNDATION_EXPORT NSErrorDomain const NSPOSIXErrorDomain; FOUNDATION_EXPORT NSErrorDomain const NSOSStatusErrorDomain; FOUNDATION_EXPORT NSErrorDomain const NSMachErrorDomain; Swiftϓϩάϥϛϯάษڧձ 2016/5/19 47 -
Swiftଆ͜Μͳײ͡ʹstructʹม͞ΕΔ struct NSErrorDomain : RawRepresentable { typealias RawValue = String
init(rawValue: RawValue) var rawValue: RawValue { get } static var Cocoa: NSErrorDomain { get } static var POSIX: NSErrorDomain { get } static var OSStatus: NSErrorDomain { get } static var Mach: NSErrorDomain { get } } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 48 -
SE-0064: Objective-Cͷήολʔηολʔϓϩ ύςΟΛηϨΫλʔͰࢀর͢Δ #selectorͰObjective-Cͷgetterɺsetter͕ࢀরͰ͖ΔΑ͏ʹ͢Δ class Person: NSObject { dynamic var
firstName: String dynamic let lastName: String dynamic var fullName: String { return "\(firstName) \(lastName)" } init(firstName: String, lastName: String) { self.firstName = firstName self.lastName = lastName } } let firstNameGetter = #selector(getter: Person.firstName) let firstNameSetter = #selector(setter: Person.firstName) Swiftϓϩάϥϛϯάษڧձ 2016/5/19 49 -
SE-0070: Make Optional Requirements Objective-C-only • Objevictive-Cͷϓϩτίϧ࣮ͯ͠͠ͳͯ͘Α͍ optionalम০ࢠ͕͚ͭΒΕΔɻ • ͰSwiftͷϓϩτίϧʹoptional͚ͭͨ͘ͳ͍ɻ
• ͳͷͰɺOptionalम০ࢠΛObjective-CͷΈʹݶఆ͠·͢ɻ • optionalम০ࢠͷલʹඞͣ@objcम০ࢠΛ͚ͭΔΑ͏ʹ͠· ͢ɻ Swiftϓϩάϥϛϯάษڧձ 2016/5/19 51 -
ྫ @objc protocol NSTableViewDelegate { @objc optional func tableView(_: NSTableView,
viewFor: NSTableColumn, row: Int) -> NSView? // correct optional func tableView(_: NSTableView, heightOfRow: Int) -> CGFloat // error: 'optional' requirements are an Objective-C compatibility feature; add '@objc' } Swiftϓϩάϥϛϯάษڧձ 2016/5/19 52