--- ./MyPlayground.playground/Contents.swift.org 2018-08-26 17:50:44.000000000 +0900 +++ ./MyPlayground.playground/Contents.swift 2020-08-17 14:09:23.289337800 +0900 @@ -1,6 +1,7 @@ //: Playground - noun: a place where people can play - +#if canImport(UIKit) import UIKit +#endif var str = "Hello, playground" --- ./MyPlayground1.playground/Contents.swift.org 2019-08-31 17:51:42.000000000 +0900 +++ ./MyPlayground1.playground/Contents.swift 2020-08-17 15:32:08.738637000 +0900 @@ -9,7 +9,9 @@ */ var welcome = "ようこそ!" // 変数の宣言と代入(P.014) +#if !NO_PLAYGROUND welcome // 変数の値が右の「リザルドサイドバー」に表示される +#endif // コンソールへのログ出力(P.016) print("本日は晴天なり") @@ -25,9 +27,13 @@ // CやJavascriptのように文末に「;」は不要。 var fruit = "りんご" // 変数の宣言と代入(P.024) +#if !NO_PLAYGROUND fruit +#endif fruit = "みかん" // 変数への代入 +#if !NO_PLAYGROUND fruit +#endif var device = "iPhone 7" // 変数名、 let Device = "iPhone 7 Plus" // 定数名、はこのように大文字小文字を区別(P.029) --- ./MyPlayground10.playground/Contents.swift.org 2018-08-28 17:39:40.000000000 +0900 +++ ./MyPlayground10.playground/Contents.swift 2020-08-17 15:44:22.211576500 +0900 @@ -47,7 +47,9 @@ do { var anyFood: Food = Noodle(name: "塩ラーメン", soup: "塩") //anyFood = Curry(name: "激辛カレー", spicy: 3) +#if !NO_PLAYGROUND anyFood.name +#endif //anyFood.spicy // エラー! //var curry: Curry = anyFood // エラー! var curry: Curry? = anyFood as? Curry // 「as?」を使ったダウンキャスト、オプショナル型になる(P.196) @@ -56,11 +58,15 @@ do { var anyFood: Food = Noodle(name: "塩ラーメン", soup: "塩") anyFood = Curry(name: "激辛カレー", spicy: 3) +#if !NO_PLAYGROUND anyFood.name +#endif //anyFood.spicy // エラー! //var curry: Curry = anyFood // エラー! var curry: Curry = anyFood as! Curry // 「as!」を使った強制的なダウンキャスト(P.197) +#if !NO_PLAYGROUND curry.spicy // 継承関係が正しければ、エラーにならない! +#endif } do { @@ -97,7 +103,9 @@ anyFood = Curry(name: "甘口カレー", spicy: 0) //anyFood.name // エラー!(P.201) (anyFood as? Food)?.name // キャストすればエラーにならない。 +#if !NO_PLAYGROUND (anyFood as! Food).name // 同上 +#endif } do { let ages: [Any] = [ 24, "三十", 22.5, 35, 40, "45", 50.5, 60 ] // 要素がAny型のArray型を定義(P.202) @@ -107,7 +115,9 @@ numbers.append(any as! Int) // 要素がInt型なので強制的にキャストして配列に追加 } } +#if !NO_PLAYGROUND numbers +#endif } protocol Drink { @@ -121,7 +131,9 @@ anyDrink.volume if anyDrink is Coffee { // 型のチェック let coffee = anyDrink as! Coffee // Coffee型にダウンキャスト(P.204) +#if !NO_PLAYGROUND coffee.bean +#endif } //let anyObject: AnyObject = anyDrink // このようには書けないので注意。 let anyObject = anyDrink as AnyObject --- ./MyPlayground15.playground/Contents.swift.org 2018-08-28 18:00:28.000000000 +0900 +++ ./MyPlayground15.playground/Contents.swift 2020-08-17 17:04:06.973011600 +0900 @@ -13,6 +13,7 @@ // 「^.」で候補 // 「^⌘?」でヘルプ +#if !os(Linux) do { let x = 10.0, y = Double.pi // 書式付き出力はやはり便利(但し、型安全ではないので引数に気をつけること) @@ -20,6 +21,7 @@ let s = String(format: "%g, %7.5f[%@]", x, y, "%") print(s) // 上のように、文字列は「%s」では無く「%@」 } +#endif do { let items //: Dictionary> // 下記のリテラルは左記の型になる。 --- ./MyPlayground3.playground/Contents.swift.org 2019-08-08 17:34:05.000000000 +0900 +++ ./MyPlayground3.playground/Contents.swift 2020-08-17 15:36:46.688101800 +0900 @@ -183,7 +183,9 @@ let age = people.1 // 同上 let gender = people.2 // 同上 people.0 = "次郎" // タプルの要素へ代入(P.170) +#if !NO_PLAYGROUND people +#endif // 名前付きタプル(P.170)、Dictionary型と似ているが、要素の名前を変数で実行時に決定できない。 var people2 = (name: "太郎", age: 20, gender: "男性") @@ -191,7 +193,9 @@ let age2 = people2.age let gender2 = people2.gender people2.name = "次郎" // 名前付きタプルの要素へ代入 +#if !NO_PLAYGROUND people2 +#endif // タプルとswitch(荻原P.168,荻原第3版P.134) var day = (4, 29) // タプル @@ -208,8 +212,10 @@ var x = 100 var y = 0 (x, y) = (y, x) +#if !NO_PLAYGROUND x y +#endif // 要素数がゼロのタプル: Void func nothing() -> () { --- ./MyPlayground5.playground/Contents.swift.org 2018-08-28 17:24:22.000000000 +0900 +++ ./MyPlayground5.playground/Contents.swift 2020-08-11 09:16:50.018456100 +0900 @@ -1,6 +1,7 @@ //: Playground - noun: a place where people can play - +#if !os(Linux) import Cocoa +#endif var str = "Hello, playground" --- ./MyPlayground6.playground/Contents.swift.org 2018-08-28 17:31:16.000000000 +0900 +++ ./MyPlayground6.playground/Contents.swift 2020-08-17 15:42:11.475313000 +0900 @@ -17,11 +17,17 @@ var type = "セダン" // (格納型)プロパティの定義(P.105) } let car = Car() +#if !NO_PLAYGROUND car.type // プロパティの取得 +#endif car.type = "SUV" // プロパティへ代入 +#if !NO_PLAYGROUND car.type // プロパティの取得 +#endif let taxi = Car() // carとは別のインスタンス +#if !NO_PLAYGROUND taxi.type // よって、"セダン" +#endif } do { class Car { @@ -29,9 +35,13 @@ } let carA = Car() let carB = carA +#if !NO_PLAYGROUND carA.type // プロパティの取得 +#endif carB.type = "ワゴン" // プロパティへ代入 +#if !NO_PLAYGROUND carA.type // プロパティの取得、carAとcarBは同一(P.145)、よって、"ワゴン" +#endif } do { class Car { @@ -50,7 +60,9 @@ let car = Car() car.mileage = 70 car.mileage = 100 +#if !NO_PLAYGROUND car.totalMileage // 70 + 100 +#endif } do { class Car { @@ -105,9 +117,13 @@ } let car = Car() car.on() // インスタンスメソッドの実行(P.113) +#if !NO_PLAYGROUND car.isOn +#endif car.off() // 同上 +#if !NO_PLAYGROUND car.isOn +#endif } do { class Car { @@ -118,7 +134,9 @@ } let car = Car() car.add(fuel: 30) // インスタンスメソッドの実行(P.115) +#if !NO_PLAYGROUND car.fuel +#endif } do { @@ -136,9 +154,13 @@ } let car = Car() car.change(speed: 40) +#if !NO_PLAYGROUND car.speed // 40 +#endif car.change(speed: 80) +#if !NO_PLAYGROUND car.speed // 40 +#endif } do { @@ -160,7 +182,9 @@ } } let bus = Bus() +#if !NO_PLAYGROUND bus.seats +#endif bus[0, 0] = "田中" bus[0, 1] = "鈴木" bus[1, 0] = "佐藤" @@ -169,6 +193,7 @@ bus[2, 1] = "渡辺" bus[3, 0] = "高橋" bus[3, 1] = "吉田" +#if !NO_PLAYGROUND bus.seats bus[0, 0] bus[0, 1] @@ -178,6 +203,7 @@ bus[2, 1] bus[3, 0] bus[3, 1] +#endif } do { class Bus { @@ -191,7 +217,9 @@ } } let bus = Bus() +#if !NO_PLAYGROUND bus.seats +#endif bus[0, 0] bus[0, 1] bus[1, 0] @@ -255,7 +283,9 @@ } let car = Car() // スーパークラスVehicleの特性を有するサブクラスCarのインスタンス car.ride() +#if !NO_PLAYGROUND car.numberOfPerson +#endif car.numberOfTire } do { @@ -278,7 +308,9 @@ for _ in 1...10 { car.ride() } +#if !NO_PLAYGROUND car.numberOfPerson // 4 +#endif } do { class Vehicle { @@ -297,6 +329,8 @@ } } let car = Car(numberOfPerson: 2, numberOfTires: 4) +#if !NO_PLAYGROUND car.numberOfPerson car.numberOfTires +#endif } --- ./MyPlayground7.playground/Contents.swift.org 2018-08-28 17:33:30.000000000 +0900 +++ ./MyPlayground7.playground/Contents.swift 2020-08-17 15:43:22.542032500 +0900 @@ -32,9 +32,11 @@ var fuelA = Fuel() var fuelB = fuelA fuelB.used = 20 +#if !NO_PLAYGROUND fuelB.used fuelA.used // fuelAとfuelBは別物(P.146) - +#endif + let fuel = Fuel() //fuel.used = 10 // エラー!定数は変更不可(P.146) } --- ./MyPlayground8.playground/Contents.swift.org 2018-08-28 17:37:30.000000000 +0900 +++ ./MyPlayground8.playground/Contents.swift 2020-08-17 17:28:26.796968600 +0900 @@ -1,6 +1,8 @@ //: Playground - noun: a place where people can play +#if !os(Linux) import Cocoa +#endif var str = "Hello, playground" @@ -103,7 +105,9 @@ for _ in 0...9 { car.upGear() } +#if !NO_PLAYGROUND car.gear +#endif } protocol GearDelegate { // デリゲートの取り決めをプロトコルに定義(P.160) func up(gear: Int) -> Int @@ -133,7 +137,9 @@ for _ in 0...9 { car.upGear() } +#if !NO_PLAYGROUND car.gear +#endif } class Car { @@ -170,6 +176,7 @@ let efficiency: FuelEfficiency = car2 efficiency.fuelEfficiency // 200 / 10 +#if !os(Linux) /* プロトコル拡張(荻原P.251,荻原第3版P.250) @@ -301,7 +308,9 @@ today.weekday // Fri today.isLeap // false today.lastDayOfMonth // 31 +#if !NO_PLAYGROUND today.modifiedJulianDay // 57990 +#endif var oneDay = GregorianDate(year: 2020, month: 2, day: 20) oneDay.modifiedJulianDay = 58899 // コメントアウトしても結果は不変 oneDay = GregorianDate(date: JulianDate(year: 2020, month: 2, day: 7)) // 同上 @@ -309,7 +318,9 @@ oneDay.weekday // Thu oneDay.isLeap // true oneDay.lastDayOfMonth // 29 +#if !NO_PLAYGROUND oneDay.modifiedJulianDay // 58899 +#endif // ユリウス暦 var julianToday = JulianDate(year: 2017, month: 8, day: 12) julianToday.modifiedJulianDay = 57990 // コメントアウトしても結果は不変 @@ -318,7 +329,9 @@ julianToday.weekday // Fri julianToday.isLeap // false julianToday.lastDayOfMonth // 31 +#if !NO_PLAYGROUND julianToday.modifiedJulianDay // 57990 +#endif var julianOneDay = JulianDate(year: 2020, month: 2, day: 7) julianOneDay.modifiedJulianDay = 58899 // コメントアウトしても結果は不変 julianOneDay = JulianDate(date: GregorianDate(year: 2020, month: 2, day: 20)) // 同上 @@ -326,5 +339,8 @@ julianOneDay.weekday // Thu julianOneDay.isLeap // true julianOneDay.lastDayOfMonth // 29 +#if !NO_PLAYGROUND julianOneDay.modifiedJulianDay // 58899 +#endif } +#endif