Xcode 9.3ãšSwift 4.1ã¯ã€ãã«ããŒã¿çã§ã¯ãªããªããŸããïŒ ãã®ãªãªãŒã¹ã«ã¯ãæšæºã©ã€ãã©ãªãšèšèªèªäœã«å¯ŸããåŸ
æã®æ¹åãå«ãŸããŠããŸãã
Swift Evolutionã®ããã»ã¹ã«åŸã£ãŠããªãå Žåã¯ããã®èšäºã圹ç«ã¡ãŸãã
ãã®èšäºã§ã¯ã
Swift 4.1ã§å°å
¥ãããæãéèŠãªå€æŽã«ã€ããŠåŠã³ãŸãã
ãã®èšäºã§ã¯Xcode 9.3ãå¿
èŠãªã®ã§ããã®ããŒãžã§ã³ã®Xcodeãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããã
æåã®ã¹ããã
Swift 4.1ã¯Swift 4ã®ãœãŒã¹ã³ãŒããšäºææ§ããããããXcodeã§
Swift Migratorã䜿çšããŠãããžã§ã¯ããSwift 4ã«æ¢ã«ç§»è¡ããŠããå Žåãæ°ããæ©èœã¯ã³ãŒãã«éåããŸããã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ã[SE-0001]ãªã©ã®é¢é£ã¿ã°ã衚瀺ãããŸãã ãããã¯ã
Swift Evolutionã®ãªãã¡ãŒçªå·ã§ãã åææ¡ãžã®ãªã³ã¯ãè¿œå ããŠãç¹å®ã®åå€æŽã®è©³çŽ°ãæãäžããããšãã§ããããã«ããŸããã äœåã§äœãæ£ç¢ºã«å€ããããããããç解ããããã«ããã¬ã€ã°ã©ãŠã³ãã䜿çšããŠå®éã«æ©èœãè©Šãããšããå§ãããŸãã
éå§ããã«ã¯ãXcode 9.3ãèµ·åãã
ãã¡ã€ã«âžæ°èŠâžãã¬ã€ã°ã©ãŠã³ããéžæã
ãŸã ã ãã©ãããã©ãŒã ãšããŠ
iOSãéžæãããã³ãã¬ãŒããšããŠ
BlankãéžæããŸãã å¿
èŠã«å¿ããŠååãä»ããŠä¿åããŸãã ãã®èšäºãæ倧éã«æŽ»çšããã«ã¯ããã¬ã€ã°ã©ãŠã³ãã§ãã¹ãŠã®æ©èœãç·Žç¿ããŠã¿ãŠãã ããã
æ³šïŒ Swift 4ã§äœãå€æŽãããã®ããèŠéããŠãè¿œãã€ãã€ããã§ããïŒ åé¡ãããŸããïŒ Swift 4 ã®æ°æ©èœãèªãã§ãSwift 4ããã§ãã¯ããŠãã ãããèšèªã®æ¹å
ãã®ãªãªãŒã¹ã§ã¯ãæ¡ä»¶ä»ãäžèŽããããã³ã«ã®é¢é£ã¿ã€ãã®ååž°çå¶éãªã©ãå€ãã®èšèªãæ¹åãããŠããŸãã
æ¡ä»¶ä»ãäžèŽ
æ¡ä»¶ä»ãäžèŽã«ãããååŒæ°ãç¹å®ã®æ¡ä»¶ãæºãããŠããæ±çšåã®ãããã³ã«äžèŽãå¯èœã«ãªããŸã
[SE-0143] ã ããã¯ãã³ãŒããããæè»ã«ãã匷åãªæ©èœã§ãã ããã€ãã®äŸã§ã©ã®ããã«æ©èœããããèŠãããšãã§ããŸãã
æšæºã©ã€ãã©ãªã®æ¡ä»¶ä»ãäžèŽ
Swift 4ã§ã¯ãèŠçŽ ã
Equatableãããã³ã«ã«æºæ ããŠããå Žåãé
åãèŸæžãããã³
ãªãã·ã§ã³ãæ¯èŒã§ããŸãã ããã¯ã次ã®ãããªåºæ¬çãªã·ããªãªã§å®å
šã«æ©èœããŸããã
// Arrays of Int let firstArray = [1, 2, 3] let secondArray = [1, 2, 3] let sameArray = firstArray == secondArray // Dictionaries with Int values let firstDictionary = ["Cosmin": 10, "George": 9] let secondDictionary = ["Cosmin": 10, "George": 9] let sameDictionary = firstDictionary == secondDictionary // Comparing Int? let firstOptional = firstDictionary["Cosmin"] let secondOptional = secondDictionary["Cosmin"] let sameOptional = firstOptional == secondOptional
Swift 4
ã§ã¯ Intã¯
Equatableã§ããããã
==æŒç®åã䜿çšããŠãããã®äŸã®ç䟡æ§ãæ€èšŒããããšã¯éåžžã«å
¬å¹³
ã§ãã ã Swift 4.1ã¯æ¡ä»¶ä»ãäžèŽã䜿çšããŠãã®åé¡ãä¿®æ£ããè¿œå ã®åã
Equatableã®åºç€ãšãªãåãšæ¯èŒã§ããããã«ããŸãã
// Array of Int? let firstArray = [1, nil, 2, nil, 3, nil] let secondArray = [1, nil, 2, nil, 3, nil] let sameArray = firstArray == secondArray // Dictionary with Int? values let firstDictionary = ["Cosmin": 10, "George": nil] let secondDictionary = ["Cosmin": 10, "George": nil] let sameDictionary = firstDictionary == secondDictionary // Comparing Int?? (Optional of Optional) let firstOptional = firstDictionary["Cosmin"] let secondOptional = secondDictionary["Cosmin"] let sameOptional = firstOptional == secondOptional
IntïŒ ã¯Swift 4.1ã§ã¯
Equatableã§ããããã
==æŒç®åã¯
[IntïŒ]ã[StringïŒIntïŒ]ããã³
Int ??ã«å¯ŸããŠæ©èœããŸãã ã
åæ§ã®åé¡ã¯ãé
åãæ¯èŒãããšãã«è§£æ±ºãããŸããïŒããšãã°ã[[Int]]ïŒã Swift 4ã§ã¯ãã»ããã
Equatableãããã³ã«ã«æºæ ããŠãããããã»ããã®é
åïŒ[Set </ Int />]ãªã©ïŒãæ¯èŒã§ããŸãã Swift 4.1ã¯ããã解決ããŸããããã¯ãé
åïŒããã³èŸæžïŒãšãã®åºç€ãšãªãå€ã
Equatableã§ããããã§ãã
let firstArrayOfSets = [Set([1, 2, 3]), Set([1, 2, 3])] let secondArrayOfSets = [Set([1, 2, 3]), Set([1, 2, 3])] // Will work in Swift 4 and Swift 4.1 // since Set<Int> is Equatable firstArrayOfSets == secondArrayOfSets let firstArrayOfArrays = [[1, 2, 3], [3, 4, 5]] let secondArrayOfArrays = [[1, 2, 3], [3, 4, 5]] // Caused an error in Swift 4, but works in Swift 4.1 // since Arrays are Equatable in Swift 4.1 firstArrayOfArrays == secondArrayOfArrays
éåžžãSwift 4.1ã®
Optional ã
Arrayãããã³
Dictionaryã¯ãããŒã¹å€ãŸãã¯èŠçŽ ããããã®ãããã³ã«ã«æºæ ããŠããå Žåã¯åžžã«ã
Equatableããã³
Hashableãããã³ã«ã«æºæ ããŠããŸãã
以äžã¯ãæšæºã©ã€ãã©ãªã§æ¡ä»¶ä»ããããã³ã°ãã©ã®ããã«æ©èœãããã®äŸã§ãã 次ã«ããããã³ãŒãã«å®è£
ããŸãã
å®éã®æ¡ä»¶ä»ãã³ã³ãã©ã€ã¢ã³ã¹
çŸåšãæ¡ä»¶ä»ããããã³ã°ã䜿çšããŠãç¬èªã®æ¥œåšã°ã«ãŒããäœæããŠããŸãã 次ã®ã³ãŒããããã¯ã
Playgroundã«è¿œå ããŸãã
// 1 class LeadInstrument: Equatable { let brand: String init(brand: String) { self.brand = brand } func tune() -> String { return "Standard tuning." } static func ==(lhs: LeadInstrument, rhs: LeadInstrument) -> Bool { return lhs.brand == rhs.brand } } // 2 class Keyboard: LeadInstrument { override func tune() -> String { return "Keyboard standard tuning." } } // 3 class Guitar: LeadInstrument { override func tune() -> String { return "Guitar standard tuning." } }
ãã®ã³ãŒããã¹ããããã€ã¹ãããã§è¡ãããšã¯æ¬¡ã®ãšããã§ãã
- LeadInstrumentã¯ã©ã¹ã¯ãEquatableãããã³ã«ã«æºæ ããŠããŸãã ç¹å®ã®ãã©ã³ããšãããŒã«ã®èª¿æŽã«äœ¿çšããtuneïŒïŒã¡ãœããããããŸãã
- Keyboardã¯ã©ã¹ã®tuneïŒïŒã¡ãœããããªãŒããŒã©ã€ãããŠããªããžã§ã¯ãã®ããã©ã«ãèšå®ãè¿ããŸãã
- ã®ã¿ãŒã®ã¯ã©ã¹ã§ãåãããšãããŸãã
次ã«ãããŒã«ã°ã«ãŒãã宣èšããŸãã
// 1 class Band<LeadInstrument> { let name: String let lead: LeadInstrument init(name: String, lead: LeadInstrument) { self.name = name self.lead = lead } } // 2 extension Band: Equatable where LeadInstrument: Equatable { static func ==(lhs: Band<LeadInstrument>, rhs: Band<LeadInstrument>) -> Bool { return lhs.name == rhs.name && lhs.lead == rhs.lead } }
æé ã¯æ¬¡ã®ãšããã§ãã
- ãã³ãã¿ã€ãã®ã¯ã©ã¹-LeadInstrumentãäœæããŸãã åã°ã«ãŒãã«ã¯ãäžæã®ååïŒãªãŒãïŒãšãªãŒã楜åšïŒã¡ã€ã³æ¥œåšïŒããããŸãã
- LeadInstrumentãç¹å®ã®ããšãè¡ãããã«ããã³ããEquatableãããã³ã«ã«æºæ ãããå Žæã䜿çšããŸãã ããã¯ãæ¡ä»¶ä»ããããã³ã°ãçŸããå Žæã§ã-æ±çšLeadInstrumentsã®Equatableãããã³ã«ã«ã³ã³ãã©ã€ã¢ã³ã¹ãå²ãåœãŠãããšãã§ããŸãã
次ã«ããæ°ã«å
¥ãã®ããŒã«ã°ã«ãŒããäœæããŠæ¯èŒããŸãã
// 1 let rolandKeyboard = Keyboard(brand: "Roland") let rolandBand = Band(name: "Keys", lead: rolandKeyboard) let yamahaKeyboard = Keyboard(brand: "Yamaha") let yamahaBand = Band(name: "Keys", lead: yamahaKeyboard) let sameBand = rolandBand == yamahaBand // 2 let fenderGuitar = Guitar(brand: "Fender") let fenderBand = Band(name: "Strings", lead: fenderGuitar) let ibanezGuitar = Guitar(brand: "Ibanez") let ibanezBand = Band(name: "Strings", lead: ibanezGuitar) let sameBands = fenderBand == ibanezBand
ãã®ã³ãŒãã¹ããããã§ã¯ã2ã€ã®ããŒããŒããšã®ã¿ãŒãããããã®ãã³ããšãšãã«äœæããŸãã 次ã«ãåã«å®çŸ©ããæ¡ä»¶ä»ãäžèŽã®ãããã§ããã³ããçŽæ¥æ¯èŒããŸãã
JSON解æã®æ¡ä»¶ä»ãäžèŽ
Swift 4.1ã§ã¯ãé
åãèŸæžãã»ãããã¢ããªã³ãCodableãããã³ã«ã«æºæ ããŠããå Žåããããã®èŠçŽ ããã®ãããã³ã«ã«æºæ ããŠããŸãã 次ã®ã³ãŒãããã¬ã€ã°ã©ãŠã³ãã«è¿œå ããŸãã
struct Student: Codable, Hashable { let firstName: String let averageGrade: Int } let cosmin = Student(firstName: "Cosmin", averageGrade: 10) let george = Student(firstName: "George", averageGrade: 9) let encoder = JSONEncoder() // Encode an Array of students let students = [cosmin, george] do { try encoder.encode(students) } catch { print("Failed encoding students array: \(error)") } // Encode a Dictionary with student values let studentsDictionary = ["Cosmin": cosmin, "George": george] do { try encoder.encode(studentsDictionary) } catch { print("Failed encoding students dictionary: \(error)") } // Encode a Set of students let studentsSet: Set = [cosmin, george] do { try encoder.encode(studentsSet) } catch { print("Failed encoding students set: \(error)") } // Encode an Optional Student let optionalStudent: Student? = cosmin do { try encoder.encode(optionalStudent) } catch { print("Failed encoding optional student: \(error)") }
[Student] ã
[StringïŒStudent] ãSet </ Student />ããã³
Studentã®ãšã³ã³ãŒãã«ãã®ã³ãŒãã䜿çšããŸã
ãïŒ ã Studentã¯
Codableã§ããããããã®ã³ãŒãã¯Swift 4.1ã§
æ£åžžã«æ©èœããŸããããã«ããããããã®ã³ã¬ã¯ã·ã§ã³ã¿ã€ãã
Codableã«é©åã«ãªããŸãã
JSONã䜿çšããå Žåã®CamelCaseãšSnake_Caseéã®å€æ
Swift 4.1ã§ã¯ãJSON解æäžã«
CamelCaseããããã£ã
snake_caseããŒã«å€æã§ããŸãã
var jsonData = Data() encoder.keyEncodingStrategy = .convertToSnakeCase encoder.outputFormatting = .prettyPrinted do { jsonData = try encoder.encode(students) } catch { print(error) } if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }
ãšã³ã³ãŒããŒãªããžã§ã¯ããäœæãããšãã«ã
keyEncodingStrategyããããã£ã
.convertToSnakeCaseã«èšå®ããŸãã ã³ã³ãœãŒã«ãèŠããšã次ã®ããã«èŠããã¯ãã§ãã
[ { "first_name" : "Cosmin", "average_grade" : 10 }, { "first_name" : "George", "average_grade" : 9 } ]
JSONã䜿çšããŠãsnake_caseããCamelCaseã«æ»ãããšãã§ããŸãã
var studentsInfo: [Student] = [] let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase do { studentsInfo = try decoder.decode([Student].self, from: jsonData) } catch { print(error) } for studentInfo in studentsInfo { print("\(studentInfo.firstName) \(studentInfo.averageGrade)") }
ä»åã¯ã
keyDecodingStrategyããããã£
ã«å€
.convertFromSnakeCaseãå²ãåœãŠãŸãã
Equatableããã³Hashableãããã³ã«ã®ã³ã³ãã©ã€ã¢ã³ã¹ãšäºææ§
Swift 4ã§ã¯ãæ§é ã
Equatableããã³
Hashableãããã³ã«ã«æºæ ããããã«ãå®åã³ãŒããèšè¿°ããå¿
èŠããã
ãŸãã ã
struct Country: Hashable { let name: String let capital: String static func ==(lhs: Country, rhs: Country) -> Bool { return lhs.name == rhs.name && lhs.capital == rhs.capital } var hashValue: Int { return name.hashValue ^ capital.hashValue &* 16777619 } }
ãã®ã³ãŒãã䜿çšããŠã
==ïŒlhsïŒrhs :)ãš
hashValueã
å®è£
ããŠã
Equatableãš
Hashableã®äž¡æ¹ããµããŒãããŸãã
Countryãªããžã§ã¯ããæ¯èŒãã
Setã«è¿œå ããããèŸæžã®ããŒãšããŠäœ¿çšããããšãã§ããŸãã
let france = Country(name: "France", capital: "Paris") let germany = Country(name: "Germany", capital: "Berlin") let sameCountry = france == germany let countries: Set = [france, germany] let greetings = [france: "Bonjour", germany: "Guten Tag"]
Swift 4.1ã§ã¯ããã¹ãŠã®ããããã£ã
Equalableããã³
Hashableã§ããããã
Equatableããã³
Hashableã«å¯Ÿå¿ããæ§é ã®ããã©ã«ãå®è£
ãè¿œå ããŸã[
SE-0185 ]ã
ããã«ããã³ãŒãã倧å¹
ã«ç°¡çŽ åããã次ã®ããã«ç°¡åã«æžãæããããšãã§ããŸãã
struct Country: Hashable { let name: String let capital: String }
é¢é£ããå€ãæã€åæ
äœã¯ãSwift 4ã§
Equatableããã³
Hashableã
䜿çšããããã«è¿œå ã®ã³ãŒããå¿
èŠã§ãã
enum BlogPost: Hashable { case tutorial(String, String) case article(String, String) static func ==(lhs: BlogPost, rhs: BlogPost) -> Bool { switch (lhs, rhs) { case let (.tutorial(lhsTutorialTitle, lhsTutorialAuthor), .tutorial(rhsTutorialTitle, rhsTutorialAuthor)): return lhsTutorialTitle == rhsTutorialTitle && lhsTutorialAuthor == rhsTutorialAuthor case let (.article(lhsArticleTitle, lhsArticleAuthor), .article(rhsArticleTitle, rhsArticleAuthor)): return lhsArticleTitle == rhsArticleTitle && lhsArticleAuthor == rhsArticleAuthor default: return false } } var hashValue: Int { switch self { case let .tutorial(tutorialTitle, tutorialAuthor): return tutorialTitle.hashValue ^ tutorialAuthor.hashValue &* 16777619 case let .article(articleTitle, articleAuthor): return articleTitle.hashValue ^ articleAuthor.hashValue &* 16777619 } } }
å®è£
==ïŒlhsïŒrhs :)ããã³
hashValueãèšè¿°ããããã«åæã±ãŒã¹ã䜿çšã
ãŸãã ã ããã«ãããããã°ã®æçš¿ãæ¯èŒããŠãã»ãããèŸæžã§äœ¿çšã§ããŸãã
let swift3Article = BlogPost.article("What's New in Swift 3.1?", "Cosmin PupÄzÄ") let swift4Article = BlogPost.article("What's New in Swift 4.1?", "Cosmin PupÄzÄ") let sameArticle = swift3Article == swift4Article let swiftArticlesSet: Set = [swift3Article, swift4Article] let swiftArticlesDictionary = [swift3Article: "Swift 3.1 article", swift4Article: "Swift 4.1 article"]
Hashableãšã¯ç°ãªãã
Equatableãš
Hashableã®å®è£
ã®ãããã§ããã®ã³ãŒãã®ãµã€ãºã¯Swift 4.1ã§ã¯å€§å¹
ã«å°ãããªã
ãŸãã ã
enum BlogPost: Hashable { case tutorial(String, String) case article(String, String) }
20è¡ã®ãã³ãã¬ãŒãã³ãŒãã§äœæ¥ããå¿
èŠããªããªããŸããã
ããã·ã¥å¯èœãªã€ã³ããã¯ã¹ã¿ã€ã
Swift 4ã§ã€ã³ããã¯ã¹ãã©ã¡ãŒã¿ã¿ã€ããããã·ã¥å¯èœãªå ŽåãããŒãã¹ã¯ã€ã³ããã¯ã¹ã䜿çšã§ããŸããããã«ãããããã«ãã¹ã§åäœã§ããããã«ãªããŸããã äŸãã°ïŒ
let swiftVersions = [3, 3.1, 4, 4.1] let path = \[Double].[swiftVersions.count - 1] let latestVersion = swiftVersions[keyPath: path]
keyPathã䜿çšããŠã
swiftVersionsããçŸåšã®SwiftããŒãžã§ã³çªå·ã
ååŸããŸãã
Swift 4.1ã¯ãæšæºã©ã€ãã©ãª[
SE-0188 ]ã®ãã¹ãŠã®æ·»ãåã¿ã€ãã«
ããã·ã¥å¯èœãªãããã³ã°ãè¿œå ããŸãã
let me = "Cosmin" let newPath = \String.[me.startIndex] let myInitial = me[keyPath: newPath]
ã€ã³ããã¯ã¹ã«ãããæååã®æåã®æåãè¿ãããŸãã Swift 4.1
ã§ã¯æååã€ã³ããã¯ã¹ã¿ã€ãã
ããã·ã¥å¯èœã§ãããã
æ©èœããŸãã
ãããã³ã«ã®é¢é£ã¿ã€ãã®ååž°çå¶é
Swift 4ã¯ããããã³ã«ã®é¢é£ããåã«å¯Ÿããååž°çå¶çŽã®å®çŸ©ããµããŒãããŠããŸããã§ããã
protocol Phone { associatedtype Version associatedtype SmartPhone } class IPhone: Phone { typealias Version = String typealias SmartPhone = IPhone }
ãã®äŸã§ã¯ãSmartPhoneã«é¢é£ä»ããããã¿ã€ããç¹å®ããŸãããããã¹ãŠã®ã¹ããŒããã©ã³ã¯é»è©±ã§ãããããPhoneã«å¶éãããšäŸ¿å©ãªå ŽåããããŸãã Swift 4.1 [
SE-0157 ]ã§å¯èœã«ãªããŸããïŒ
protocol Phone { associatedtype Version associatedtype SmartPhone: Phone where SmartPhone.Version == Version, SmartPhone.SmartPhone == SmartPhone }
ããŒãžã§ã³ãšã¹ããŒããã©ã³ã®äž¡æ¹ãé»è©±ãšåãã«ãªãããã«å¶éããå Žæã䜿çšããŸãã
ãããã³ã«å
ã®åŒ±ããªã³ã¯ãšããžãŒã§ãªããªã³ã¯
Swift 4ã¯ã
è匱ã§
ææãããŠããªããããã³ã«ããããã£ããµããŒãããŠããŸãã
class Key {} class Pitch {} protocol Tune { unowned var key: Key { get set } weak var pitch: Pitch? { get set } } class Instrument: Tune { var key: Key var pitch: Pitch? init(key: Key, pitch: Pitch?) { self.key = key self.pitch = pitch } }
ç¹å®ã®ããŒãšãããã§æ¥œåšããã¥ãŒãã³ã°ããŸããã ã¹ãããã¯ãŒãã ã£ãå¯èœæ§ããããããTuneãããã³ã«ã§ã¯åŒ±ããã®ãšããŠã·ãã¥ã¬ãŒãããŸãã
ãã ãããããã³ã«èªäœã§å®çŸ©ãããŠããå Žåã匱ããã®ãšææãããŠããªããã®ã®äž¡æ¹ã¯å®è³ªçã«æå³ããªããããSwift 4.1ã¯ããããåé€ãããããã³ã«[
SE-0186 ]ã§ãããã®ããŒã¯ãŒãã䜿çšããŠèŠåãåãåããŸãïŒ
protocol Tune { var key: Key { get set } var pitch: Pitch? { get set } }
ã³ã¬ã¯ã·ã§ã³å
ã®ã€ã³ããã¯ã¹è·é¢
Swift 4ã¯
IndexDistanceã䜿çšããŠãã³ã¬ã¯ã·ã§ã³å
ã®èŠçŽ ã®æ°ã宣èšããŸããã
func typeOfCollection<C: Collection>(_ collection: C) -> (String, C.IndexDistance) { let collectionType: String switch collection.count { case 0...100: collectionType = "small" case 101...1000: collectionType = "medium" case 1001...: collectionType = "big" default: collectionType = "unknown" } return (collectionType, collection.count) }
typeOfCollectionïŒ_ :)ã¡ãœããã¯ãã³ã¬ã¯ã·ã§ã³ã®ã¿ã€ããšéãå«ãã¿ãã«ãè¿ããŸãã é
åãèŸæžãã³ã¬ã¯ã·ã§ã³ãªã©ã®ã³ã¬ã¯ã·ã§ã³ã«äœ¿çšã§ããŸãã äŸãã°ïŒ
typeOfCollection(1...800) // ("medium", 800) typeOfCollection(greetings) // ("small", 2)
whereå¥ã䜿çšããŠ
IndexDistanceã
Intã«å¶éããããšã«ãããé¢æ°ã®æ»ãå€ã®åãæ¹åã§ããŸãã
func typeOfCollection<C: Collection>(_ collection: C) -> (String, Int) where C.IndexDistance == Int {
Swift 4.1ã¯æšæºã©ã€ãã©ãªã®
IndexDistanceãIntã«çœ®ãæããŠããããããã®å Žåã
whereå¥[
SE-0191 ]ã¯äžèŠã§ãã
func typeOfCollection<C: Collection>(_ collection: C) -> (String, Int) {
ã¢ãžã¥ãŒã«ã®æ§é ã€ãã·ã£ã©ã€ã¶ãŒ
ããããã£ã
ãããªãã¯æ§é ã«è¿œå ãããšãSwift 4ã®åæå€æŽãçºçããå¯èœæ§ããããŸãããã®èšäºã§ã¯ã
View \ Navigators \ Show Project Navigatorã«ç§»åããŠXcodeã§Project Navigatorã衚瀺ãããããšã確èªã
ãŸãã 次ã«ãããœãŒã¹ããå³ã¯ãªãã¯ããŠãã¡ãã¥ãŒãããæ°èŠãã¡ã€ã«ããéžæããŸãã
DiceKit.swiftãã¡ã€ã«ã®ååã
å€æŽããŸãã ãã®å
容ã次ã®ã³ãŒããããã¯ã«çœ®ãæããŸãã
public struct Dice { public let firstDie: Int public let secondDie: Int public init(_ value: Int) { let finalValue: Int switch value { case ..<1: finalValue = 1 case 6...: finalValue = 6 default: finalValue = value } firstDie = finalValue secondDie = 7 - finalValue } }
æ§é ã€ãã·ã£ã©ã€ã¶ã¯ãäž¡æ¹ã®ãã€ã¹ã1ã6ã®æå¹ãªå€ãæã€ããã«ããŸãã
ãã¬ã€ã°ã©ãŠã³ãã«æ»ããæåŸã«ãã®ã³ãŒããè¿œå ããŸãã
// 1 let dice = Dice(0) dice.firstDie dice.secondDie // 2 extension Dice { init(_ firstValue: Int, _ secondValue: Int) { firstDie = firstValue secondDie = secondValue } } // 3 let newDice = Dice(0, 7) newDice.firstDie newDice.secondDie
ãã®ã³ãŒãã§è¡ã£ãããšã¯æ¬¡ã®ãšããã§ãã
- æå¹ãªãµã€ã³ãã®ãã¢ãäœæããŸããã
- ããããã£ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããå¥ã®åæååãä»ããŠDiceãè¿œå ããŸããã
- æ°ããæ§é ã€ãã·ã£ã©ã€ã¶ã䜿çšããŠãç¡å¹ãªãµã€ã³ãã®ãã¢ãç¹å®ããŸããã
Swift 4.1ã§ã¯ã
ã¯ãã¹ã¿ãŒã²ããã€ãã·ã£ã©ã€ã¶ãŒã¯ããã©ã«ãå€ãçºçãããå¿
èŠããããŸãã Diceæ¡åŒµã次ã®ããã«å€æŽããŸãã
extension Dice { init(_ firstValue: Int, _ secondValue: Int) { self.init(abs(firstValue - secondValue)) } }
ãã®å€æŽã«ãããæ§é ã¯ã¯ã©ã¹ã®ããã«åäœããŸããã¯ãã¹ã¢ãžã¥ãŒã«åæååã¯ãSwift 4.1 [
SE-0189 ]ã®ç°¡æåæååã§ãªããã°ãªããŸããã
Swift 4.1ã§ã¯ããµã€ã³ãã²ãŒã ãããŸããããšã¯ã§ããŸããïŒ
ãã©ãããã©ãŒã èšå®ãšæ§æã®æŽæ°
Swift 4.1ã¯ãã³ãŒããã¹ãã«å¿
èŠãªãã©ãããã©ãŒã ãšãã«ãæ©èœã®äžéšãè¿œå ããŸãã
ã€ã³ããŒãã®ãã«ã
Swift 4ã§ã¯ãç¹å®ã®ãã©ãããã©ãŒã ã§äœ¿çšå¯èœãªã¢ãžã¥ãŒã«ããã¹ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã èªäœãå®çŸ©ããŸãããäŸïŒ
#if os(iOS) || os(tvOS) import UIKit print("UIKit is available on this platform.") #else print("UIKit is not available on this platform.") #endif
UIKitã¯
iOSããã³
tvOSã§äœ¿çšã§ããããããã¹ããæåããå Žåã¯ã€ã³ããŒãããŸããã Swift 4.1ã§ã¯ãã¢ãžã¥ãŒã«èªäœããã§ãã¯ã§ããããããã®ããã»ã¹ãç°¡çŽ åãããŸãã
#if canImport(UIKit) print("UIKit is available if this is printed!") #endif
Swift 4.1ã§ã¯ã
ïŒif canImportïŒUIKitïŒã䜿çšããŠãç¹å®ã®æ§é ãã€ã³ããŒãã«å©çšã§ããããšã確èªããŸã[
SE-0075 ]ã
ã¿ãŒã²ããç°å¢
Swift 4ã§ã³ãŒããèšè¿°ãããšããã·ãã¥ã¬ãŒã¿ãŒãŸãã¯ç©çããã€ã¹ã§ã³ãŒãã®å®è¡ããã§ãã¯ããæãæåãªæ¹æ³ã¯ãã¢ãŒããã¯ãã£ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã§ãã¯ããããšã§ããã
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(tvOS) || os(watchOS)) print("Testing in the simulator.") #else print("Testing on the device.") #endif
Intelã«åºã¥ããããã»ããµã¢ãŒããã¯ãã£ãšããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒiOSãtvOSããŸãã¯watchOSïŒã¯ã·ãã¥ã¬ãŒã¿ã§ãã¹ãããŸãããã ãã以å€ã®å Žåã¯ãããã€ã¹ããã¹ãããŸããã
ãã®ãã¹ãã¯éåžžã«é¢åã§ããšã©ãŒã®çš®é¡ãå®å
šã«ã¯èª¬æããŠããŸããã§ããã Swift 4.1ã¯ãã®ãã¹ããç°¡åã«ããŸãã 次ã®ããã«ãtargetEnvironmentïŒã·ãã¥ã¬ãŒã¿ãŒïŒ[SE-0190]ã䜿çšããã ãã§ãã
#if targetEnvironment(simulator) print("Testing in the simulator.") #endif
ãã®ä»ã®å°ç
Swift 4.1ã«ã¯ãç¥ã£ãŠãã䟡å€ã®ããä»ã®æŽæ°ãããã€ããããŸãã
å§çž®ã·ãŒã±ã³ã¹
Swift 4ã§ã¯ã
flatMapïŒ_ :)ã䜿çšããŠã·ãŒã±ã³ã¹ããnilå€ããã£ã«ã¿ãªã³ã°ããããšã¯ããªãäžè¬ç
ã§ãã ïŒ
let pets = ["Sclip", nil, "Nori", nil] let petNames = pets.flatMap { $0 }
æ®å¿µãªããã
flatMapïŒ_ :)ã¯ããŸããŸãªæ¹æ³ã§éè² è·ã«ãªãããã®ç¹å®ã®ã·ããªãªã§ã¯ã
flatMapïŒ_ :)ã®å²ãåœãŠã¯å®è¡ãããã¢ã¯ã·ã§ã³ãããŸã説æããŸããã§ããã
ãããã®çç±ãããSwift 4.1ã¯
flatMapïŒ_ :)ã®ååã
compactMapïŒ_ :)ã«
å€æŽãããã®æå³ãããæ確ã§ãŠããŒã¯ãªãã®ã«ããŸãã[
SE-0187 ]ïŒ
let petNames = pets.compactMap {$ 0}
å®å
šã§ãªããã€ã³ã¿ãŒ/å®å
šã§ãªããã€ã³ã¿ãŒ
Swift 4ã¯ãäžæçã«å®å
šã§ãªãå¯å€ãã€ã³ã¿ã䜿çšããŠãå®å
šã§ãªãå¯å€ãããã¡ãã€ã³ã¿ãäœæããã³å€æŽããŸããã
let buffer = UnsafeMutableBufferPointer<Int>(start: UnsafeMutablePointer<Int>.allocate(capacity: 10), count: 10) let mutableBuffer = UnsafeMutableBufferPointer(start: UnsafeMutablePointer(mutating: buffer.baseAddress), count: buffer.count)
Swift 4.1ã§ã¯ãå®å
šã§ãªãå¯å€ãããã¡ãŒãã€ã³ã¿ãŒãšåãã¢ãããŒãã䜿çšããŠãå®å
šã§ãªãå¯å€ãããã¡ãŒãã€ã³ã¿ãŒãçŽæ¥æäœã§ããŸã[
SE-0184 ]ïŒ
æ°ããéã³å Žæ©èœ
Swift 4ã§ã¯ã
Playground Xcodeã§ã¿ã€ãã®èª¬æãã«ã¹ã¿ãã€ãºã§ããŸããã
class Tutorial {} extension Tutorial: CustomPlaygroundQuickLookable { var customPlaygroundQuickLook: PlaygroundQuickLook { return .text("raywenderlich.com tutorial") } } let tutorial = Tutorial()
ãã¥ãŒããªã¢ã«ã« CustomPlaygroundQuickLookableãå®è£
ããçã説æãè¿ããŸããã
customPlaygroundQuickLookã®èª¬æã¿ã€ãã¯ã
PlaygroundQuickLookã±ãŒã¹ã«éå®ãããŠããŸããã Swift 4.1ã®ãã®ãããªãããã¯ãããããŸããïŒ
extension Tutorial: CustomPlaygroundDisplayConvertible { var playgroundDescription: Any { return "raywenderlich.com tutorial" } }
ä»åã¯
CustomPlaygroundDisplayConvertibleãå®è£
ããŠããŸãã 説æã¿ã€ãã¯
Anyãªã®ã§ãplaygroundDescriptionããäœã§ãè¿ãããšãã§ããŸãã ããã«ãããã³ãŒããç°¡çŽ åãããããæè»ã«ãªããŸã[
SE-0198 ]ã
次ã¯ïŒ
Swift 4.1ã¯ãä»å¹Žã®Swift 5ã§çºçããããæ·±å»ãªå€æŽã«åããŠãSwift 4ã®æ©èœã®äžéšã匷åããŠããŸãã ããã«ã¯ãABIã®å®å®æ§ãæ¹è¯ããããžã§ããªãã¯ãšæååãã¡ã¢ãªã®æææš©ãšåæå®è¡æ§ã®æ°ãããã¿ãŒã³ãªã©ãå«ãŸããŸãã
åéºå®¶ã®æ°åã«ãªã£ããã
æšæºã®Swiftã©ã€ãã©ãªãŸãã¯å
¬åŒã®
Swift CHANGELOG Webãµã€ãã«ã¢ã¯ã»ã¹ã㊠ããã®ããŒãžã§ã³ã®ãã¹ãŠã®å€æŽã«é¢ãã詳现æ
å ±ãåç
§ããŠãã ããã
Swift 5ã®å€æŽç¹ã«èå³ãããå Žå
㯠ãæ°æ©èœãå€æŽãè¿œå ã確èªã§ãã
Swift Evolutionã®æäŸãããç解ããããšããå§ãããŸãã