swift 2.0 で変わったところ「後編」 #cswift
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