20200709のSwiftに関する記事は16件です。

AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 計算編)

トピック #4 計算

AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。

4_A 割り算

問題
2つの整数 a と b を読み込んで、以下の値を計算するプログラムを作成して下さい:

a ÷ b : d (整数)
a ÷ b の余り : r (整数)
a ÷ b : f (浮動小数点数)

解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
print(a[0]/a[1],a[0]%a[1],Double(a[0])/Double(a[1]))

4_B 園の面積と演習

問題
半径 r の円の面積と円周の長さを求めるプログラムを作成して下さい。
解答

import Foundation
let a = Double(readLine()!)!
print(a*a*M_PI,2.0*a*M_PI)

円周率はimport FoundationまたはUIKitしたのちM_PIで表せます。

4_C 計算機

問題
2つの整数 a, b と1つの演算子 op を読み込んで、a op b を計算するプログラムを作成して下さい。ただし、演算子 op は、"+"(和)、"-"(差)、"*"(積)、"/"(商)、のみとし、割り算で割り切れない場合は、小数点以下を切り捨てたものを計算結果とします。

解答

let a = readLine()!.split(separator: " ")
while a[1] != "?" {
    var s = Int(a[0])!
    var t = Int(a[2])!
    var u = a[1]
    switch u {
    case "+":
        print(s+t)
    case "-":
        print(s-t)
    case "*":
        print(s*t)
    default:
        print(s/t)
    }
}

問題
1行目に整数の数nが与えられます。2行目にnこの整数a_iが空白区切りで与えられます。
最小値、最大値、合計値を空白区切りで1行に出力してください。
解答

let n = Int(readLine()!)!
let a = readLine()!.split(separator: " ").map({Int($0)!}).sorted()
var sum = 0
for i in a {
    sum += i
}
print(a[0],a[n-1],sum)

配列.sorted()は便利ですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

練習のためにSwiftをUdemyで勉強してみた(2日目)

2日目にやったことの概要

  • JSONのデータを取得してくる日の出時間表示アプリの制作(後述だが、没)
  • Covid-19の感染者数を表示するアプリの制作

なぜ、日の出時間表示アプリの制作をやめたのか

Yahoo Weather apiを使う内容になっていたのだが、すでにAPIが使えなくなっていたため。
更新してほしかった。。。
https://akkiesoft.hatenablog.jp/entry/20190120/1547972476

今回はAPIを使い、JSONデータを取得して、結果を表示する、ことがメインとなるので、自分で他のAPIを探すことにした
で、選んだのがCovid-19の感染者数だった

Rakuten Rapid APIを使い始めた

シンプルそうな「COVID-19」を選んだ。日毎の感染者数・死者などを取得できるらしい。
https://api.rakuten.net/api-sports/api/covid-193/

実験してみて死んだ。
Udemyの教材は、APIのURLを叩けば、JSONデータを取得できたが、Covid-19はユーザーごとの利用状況を確認する必要からヘッダーにユーザー情報の入力が必要になっていた。
流石に、素人にこの応用はできない。

試行錯誤してみたが、別の簡単そうなAPIに変更して実験する必要がある、というところで本日は終了。

今回出くわした問題

憧れのAPIをいじることを始めてみたが、難しい、と直感的に思った。
しかし、色々とやってみるとできることも格段に増えるだろうし、ちょっと寄り道してAPIについて調べてみよう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftで有効桁数

Swiftで有効桁数を表現するにはどうすればいいのだろう?と調べたのでメモ

import UIKit
let a = 3.000
let b = 2.000
let c = Double(a)/Double(b)
let d = String(format: "%.3f", c)
print(c,d)
=> 1.5 1.500

他にも方法はあると思います。ぜひコメントしてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 繰り返し処理編)

トピック #1 繰り返し処理

AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。
テスト入力はこちらのPaisa.IOで行っています。

3_A 複数のHelloWorldの出力

問題
1000 個の "Hello World" を出力するプログラムを作成して下さい。
解答

for _ in 0 ..< 1000 {
    print("Hello World")
}

3_B テストケースの出力

問題
入力は複数のデータセットから構成されています。各データセットは1つの整数 x を含む1行から構成されています。xが0のとき入力の終わりを示し、このデータセットに対する出力を行ってはいけません。
各データセットごとに、以下の形式で x を出力して下さい
3
5
11
7
8
19
0

Case 1: 3
Case 2: 5
Case 3: 11
Case 4: 7
Case 5: 8
Case 6: 19

var count = 1
while(true) {
    let a = Int(readLine()!)!
    if a == 0 {
        break
    }
    print("case \(count): \(a)")
    count += 1
}

3_C 2つの数の交換

問題
入力は複数のデータセットから構成されています。各データセットは空白で区切られた2つの整数 x, y を含む1行から構成されています。x と y がともに 0 のとき入力の終わりを示し、このデータセットに対する出力を行ってはいけません。
入力
3 2
2 2
5 3
0 0
出力
2 3
2 2
3 5

while(true){
    let a = readLine()!.split(separator: " ").map({Int($0)!})
    let first = a[0]
    let second = a[1]
    if first == 0 && second == 0{
        break
    }
    print(a[1],a[0])
}

3_D約数の数

入力
3つの整数a、b、cを読み込み、aからbまでの整数の中にcの約数がいくつあるのかを求めるプロフラムを作成して下さい。
解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
var multipleArr: [Int] = []
var count = 0
for i in 0 ..< a[2] {
    if a[2].isMultiple(of: i) {
        multipleArr.append(i)
    }
}

for i in a[0] ..< a[1] {
    if multipleArr.contains(i) {
        count += 1
    }
}

print(count)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】xcode for文でイメージを変える

やりたいこと

for文でイメージを変える

準備すること

イメージを3つ準備する
名前をそれぞれ0,1,2とする。

コード

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!

    var timer = Timer()
    var count = Int()
    var imageArray = [UIImage]()

    override func viewDidLoad() {
        super.viewDidLoad()

        count = 0
        stopButton.isEnabled = true

        for i in 0..<3{
            print(i)
            let image = UIImage(named: "\(i)")
            imageArray.append(image!)}

        //最初のイメージを設定
        imageView.image = UIImage(named:"0")}

    func startTimer(){
        timer = Timer.scheduledTimer(timeInterval: 0.1,target:  self,selector: #selector(timerUpdate), userInfo: nil, repeats: true)
    }

    @objc func timerUpdate(){
        count = count + 1
        if count > 2 {
            count = 0
        }
        imageView.image = imageArray[count]
    }

    @IBAction func start(_ sender: Any) {
        //startButtonを無効化
        startButton.isEnabled = false
        //stopButtonを有効化
        stopButton.isEnabled = true
        //上のstartTimerのメソッドを呼び出す
        startTimer()
    }

    @IBAction func stop(_ sender: Any) {
        //startButtonを有効化
        startButton.isEnabled = true
       //stopButtonを無効化
        stopButton.isEnabled = false

        //timer止める
        timer.invalidate()
    }
}

シミュレーター

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 条件分岐編)

トピック #1 条件分岐

AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。

2_A 大小関係

問題 2つの整数 a, b を読み込んで、a と b の大小関係を出力するプログラムを作成して下さい。
解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] > a[1] {
    print("a>b")
} else if a[0] < a[1] {
    print("a<b")
} else {
    print("a=b")
}

2_B 範囲

問題 3つの整数a, b, cを読み込み、それらが a < b < cの条件を満たすならば"Yes"を、満たさないならば"No"を出力するプログラムを作成して下さい。

解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] < a[1] && a[1] < a[2] {
    print("yes")
} else {
    print("no")
}

2_C 3つの数の整列

問題小さい順に並べ替えた3つの整数を1行に出力して下さい。整数の間に1つの空白を入れて下さい。
解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
print(a.sorted())

3_C 長方形の中の円

問題
長方形の中に円が含まれるかを判定するプログラムを作成してください。次のように、長方形は左下の頂点を原点とし、右上の頂点の座標(W,H)が与えられます。また、円はその中心の座標(x,y) と半径rで与えられます。
解答

let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] > a[2] + a[4]  && a[1] > a[3] + a[4] && a[0] > 0 && a[1] > 0{
    print("Yes")
} else {
    print("No")
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門)

トピック #1 入門

AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。

1_A Hello World

問題 "Hello World" と標準出力にプリントするプログラムを作成してください。
解答

print("Hello World")

1_B xの3乗

問題 入力された数字の3乗の結果を出力してください
解答

import UIKit
let a = Double(readLine()!)!
print(Int(pow(a, 3.0)))
import UIKit
print(Int(pow(Double(readLine()!)!, 3.0)))

でも可能。pow()を使うにはUIKitをimportしなければなりません。

1_C 長方形の面積と周の長さ

問題 たて a cm よこ b cm の長方形の面積と周の長さを求めるプログラムを作成して下さい。
解答

let a = readLine()!.split(separator: " ")
let b = Int(a[0]) ?? 0
let c = Int(a[1]) ?? 0
print("\(b*c) \(2*(b+c))")v
let a = readLine()!.split(separator: " ").map({Int($0)!})
print("\(a[0]*a[1]) \(2*(a[0]+a[1]))")

でも可能。

1_D 時計

問題
秒単位の時間sが与えられるので、h:m:sの形式へ変換して出力してください。ここで、hは時間、mは 60 未満の分、sは 60 未満の秒とします。
解答

let a = Int(readLine()!)!
let hours = a / 3600
let c = a % 3600
let minutes = c / 60
let seconds = c % 60
print("\(hours):\(minutes):\(seconds)")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 入門編)

トピック #1 入門

AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。

1_A Hello World

問題 "Hello World" と標準出力にプリントするプログラムを作成してください。
解答

print("Hello World")

1_B xの3乗

問題 入力された数字の3乗の結果を出力してください
解答

import UIKit
let a = Double(readLine()!)!
print(Int(pow(a, 3.0)))
import UIKit
print(Int(pow(Double(readLine()!)!, 3.0)))

でも可能。pow()を使うにはUIKitをimportしなければなりません。

1_C 長方形の面積と周の長さ

問題 たて a cm よこ b cm の長方形の面積と周の長さを求めるプログラムを作成して下さい。
解答

let a = readLine()!.split(separator: " ")
let b = Int(a[0]) ?? 0
let c = Int(a[1]) ?? 0
print("\(b*c) \(2*(b+c))")v
let a = readLine()!.split(separator: " ").map({Int($0)!})
print("\(a[0]*a[1]) \(2*(a[0]+a[1]))")

でも可能。

1_D 時計

問題
秒単位の時間sが与えられるので、h:m:sの形式へ変換して出力してください。ここで、hは時間、mは 60 未満の分、sは 60 未満の秒とします。
解答

let a = Int(readLine()!)!
let hours = a / 3600
let c = a % 3600
let minutes = c / 60
let seconds = c % 60
print("\(hours):\(minutes):\(seconds)")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftUIとStoryBoardの共存時期の過ごし方 for watchOS

そろそろSwiftUI使ってもいいよね?

iOS14betaも発表されて、そろそろエンタープライズアプリもiOS13対応が許される季節になってきましたが、皆様いかがお過ごしでしょうか?
と言っても、実際には過去のプロジェクトはStoryboardで沢山の画面が作られているわけで、むしろ僕の触ってるプロジェクトはそもそもObjective-Cだったりするんですが、利用現場の端末のバージョンも上がってきて、そろそろiOS13 / watchOS6の機能を使えるような空気が漂ってきました。

iOSでStoryboardとSwiftUIを混ぜる方法は こちらの記事を参考にさせていただいて非常に助かりました。

ところが開発者の少ないwatchOS関連は探してもなかなか見つからないのです。そうですね。仕方ないからメモを残しておきます。
業務の終わりのタイミングで書いてるので本当にメモです。

storyboardなInterfaceControllerからSwiftUIに遷移

既存のInterfaceControllerからSwiftUIを呼ぶには、WKHostingController を使います。
https://developer.apple.com/documentation/swiftui/wkhostingcontroller

WKHostingController は InterfaceControllerを継承しているので、今までと同じ感覚でクラスを連携させれば呼べます。

まずは、今までのWKInterfaceControllerの代わりに WKHostingControllerでコントローラーclassを作ります。

HomeViewInterfaceController.swift
import SwiftUI

class HomeViewInterfaceController : WKHostingController<HomeView> {
    override var body: HomeView {
        return HomeView()
    }
}
HomeView.swift
import SwiftUI

struct Menu: Identifiable{
    var id: Int
    var name: String

    init(id: Int, name: String){
        self.id = id
        self.name = name
    }    
}

class MenuList: ObservableObject{
    @Published var list: [Menu]

    init(){
        self.list = [
            Menu(id: 1, name:"Apple"),
            Menu(id: 2, name:"Banana"),
            Menu(id: 3, name:"Cookie"),
            Menu(id: 4, name:"Donuts")]
    }    
}

struct HomeView: View {
    @ObservedObject var mymenu: MenuList = MenuList()

    var body: some View {
        List {
            ForEach(mymenu.list){ item in
                NavigationLink(destination: SecondView(id: item.id)) {
                    Text("\(item.name)")
                }
            }
        }
    }
}

storyboardにinterfaceControllerを追加して、参照先のclassをHomeViewInterfaceController.swift に Identifierを "HomeViewInterfaceController"にします。
スクリーンショット 2020-07-09 17.43.56.png

InterfaceControllerから SwiftUIを呼び出すには

InterfaceController.m
    [self pushControllerWithName:@"HomeViewInterfaceController" context:nil];

//rootViewとして呼び出すには
    [WKInterfaceController reloadRootPageControllersWithNames:@[@"HomeViewInterfaceController"] contexts:nil orientation:WKPageOrientationVertical pageIndex:0];

といつものようにIdentifierを指定してあげればOK。

HomeからSwiftUIで定義されているSecondViewを呼び出すには、上の

                NavigationLink(destination: SecondView(id: item.id)) {
                    Text("\(item.name)")
                }

で呼び出せます。

SwiftUIからwatchKitのstoryboardのInterfaceControllerに遷移

public init(destinationName: String, @ViewBuilder label: () -> Label)

を使います。

NavigationLink(destinationName: "second") {
    Text("\(item.name)")
}

SwiftUIからstoryboard のInterfaceControllerでrootViewsをリセット

            Button(action: {
                WKInterfaceController.reloadRootControllers(withNamesAndContexts: [(name: "second", context: [:] as AnyObject )])
            }){
                Text("second")
            }

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】XcodeのAttributes Inspectorにある画像をコードで表示する(SF Symbols)

はじめに

XcodeのAttributes Inspectorにある画像をコードで表示させる方法が分からなかったので記載します。↓にある画像です。
ちなみに、これは SF Symbols といい、iOS 13から追加されたものになります。
詳しくはこちらのドキュメントをご覧ください。

スクリーンショット 2020-07-09 16.26.37.png

環境

  • Swift:5.1.3
  • Xcode:11.3.1

実装

UIImage(systemName: "画像名") で実装できます。
例えば、UIButtonにゴミ箱の画像を表示させるには、このように書きます。

SampleViewController.swift
let trashButton = UIButton()
trashButton.setImage(UIImage(systemName: "trash"), for: .normal)
trashButton.sizeToFit()
trashButton.center = self.view.center
self.view.addSubview(trashButton)

スクリーンショット 2020-07-09 16.57.51.png

参考記事

iOSアプリでSystem Imageを使用する(iOS13以降)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】ナビゲーションバーの戻るボタンの処理をカスタマイズしたい

はじめに

ナビゲーションバーの戻るボタンをタップ時に、「ダイアログを表示 -> キャンセルの場合、遷移させない」という処理を実装したかったのですが、デフォルトで実装されている戻るボタン (backBarButtonItem) をカスタマイズする方法ではうまくいきませんでした。

ダメだった方法
SomeViewController.swift
// MARK: onTapBackButton は呼ばれない
let backButton = UIBarButtonItem(image: chevronLeftImage, style: .plain, target: self, action: #selector(onTapBackButton(_:)))
navigationItem.backBarButtonItem = backButton

そこでデフォルトの戻るボタンは使わず、新たにボタンを作成し leftBarButtonItem として配置するという方法で実装しました。

環境

  • Xcode 11.5
  • Swift 5.2.4

デフォルトの戻るボタンを置き換える

特定の ViewController のみボタンを置き換えた場合、デフォルトの戻るボタンと見た目が変わってしまうため、今回は全てのボタンを置き換えます。
すべての画面で読み込む親クラスとして CommonViewController を生成し実装していきます。

コード全体
CommonViewController.swift
class CommonViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        backButton()
    }

    private func backButton() {
        let currentViewController = String(describing: type(of: self))
        guard !currentViewController == "FirstViewController" else {
            return
        }

        let chevronLeftImage: UIImage? = UIImage(systemName: "chevron.left")
        let backButton = UIBarButtonItem(image: chevronLeftImage, style: .plain, target: self, action: #selector(onTapBackButton(_:)))
        navigationItem.leftBarButtonItem = backButton
    }

    @objc
    func onTapBackButton(_ sender: UIBarButtonItem) {
        navigationController?.popViewController(animated: true)
    }
}

最初の画面 (FirstViewController) では戻るボタンを非表示にします。

CommonViewController.swift
// 現在の ViewController 名を取得
let currentViewController = String(describing: type(of: self))
guard !currentViewController == "FirstViewController" else {
    return
}

新たにボタンを生成し leftBarButtonItem に登録します。
leftBarButtonItem が表示されている場合、デフォルトの戻るボタンは非表示になります。

CommonViewController.swift
let chevronLeftImage: UIImage? = UIImage(systemName: "chevron.left")
let backButton = UIBarButtonItem(image: chevronLeftImage, style: .plain, target: self, action: #selector(onTapBackButton(_:)))
navigationItem.leftBarButtonItem = backButton

タップ時に呼び出されるアクションに、前画面へ遷移する処理を記述します。

CommonViewController.swift
@objc
func onTapBackButton(_ sender: UIBarButtonItem) {
    navigationController?.popViewController(animated: true)
}

特定の ViewController で処理をカスタマイズする

処理をカスタマイズしたい ViewController で onTapBackButton を override します。

SomeViewController.swift
@objc
override func onTapBackButton(_ sender: UIBarButtonItem) {
    // TODO: ここに処理を記述
    navigationController?.popViewController(animated: true)
}

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftで文字列に文字を追加する

Google Books APIを使用する際、http通信になってしまいATS制限に引っかかったので対処法を備忘録として記しておきます。

http -> https

var url = "http://www.google.com"

let insertIndex = url.index(previewLink.startIndex, offsetBy: 4)
url.insert(contentsOf: "s", at: insertIndexToPreviewLink)

print(url)  // "https://www.google.com"

別記

ATS制限には、Info.plistを編集を編集することでも対応できる。

参考

Swiftで指定したindexに文字・文字列を挿入する方法
[iOS] ATS対応徹底攻略!対応策とInfo.plistより行うATSの設定値まとめ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(今後も更新予定)たった数行のコードで作成できる iOS 14 の新たなフレームワークの機能

1、 App Store アプリの概要カードをフロート表示する

アプリ内で他のApp Storeアプリをおすすめしたい場合、5行のコードで簡単にアプリの概要カードを表示することができます。

image.png

if let scene = view.window?.windowScene {
    let config = SKOverlay.AppConfiguration(appIdentifier: "1494658162", position: .bottom) //App Store アプリのApple ID
    let overlay = SKOverlay(configuration: config)
    overlay.present(in: scene)
}

2、明日も更新予定

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(明日も更新予定) たった数行のコードで作成できる iOS 14 の新たなフレームワークの機能

1、 App Store アプリの概要カードをフロート表示する

アプリ内で他のApp Storeアプリをおすすめしたい場合、5行のコードで簡単にアプリの概要カードを表示することができます。

image.png

if let scene = view.window?.windowScene {
    let config = SKOverlay.AppConfiguration(appIdentifier: "1494658162", position: .bottom) //App Store アプリのApple ID
    let overlay = SKOverlay(configuration: config)
    overlay.present(in: scene)
}

2、明日も更新予定

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

たった数行のコードで作成できる iOS 14 の新たなフレームワークの機能

  • App Store アプリの概要カードをフロート表示する
  • UIBarButtonItem にフローティングメニューを表示
  • インラインの日付ピッカーを表示
  • コンパクト日付ピッカーを表示する
  • カラーピッカーを表示する
  • ゲームセンター用のフローティングウィンドウを表示 (Game Center)

App Store アプリの概要カードをフロート表示する

アプリ内で他のApp Storeアプリをおすすめしたい場合、5行のコードで簡単にアプリの概要カードを表示することができます。

image.png

if let scene = view.window?.windowScene {
    let config = SKOverlay.AppConfiguration(appIdentifier: "1494658162", position: .bottom) //App Store アプリのApple ID
    let overlay = SKOverlay(configuration: config)
    overlay.present(in: scene)
}

UIBarButtonItem にフローティングメニューを表示

UIAlertController を表示する代わりに、フローティングメニューを表示できます

navBar.png

let addCat = UIAction(title: "猫を追加", image: UIImage(systemName: "plus")) { (action) in
    print("猫を追加")
}
let shareButton = UIAction(title: "リストを共有", image: UIImage(systemName: "paperplane")) { (action) in
    print("リストを共有")
}
let menu = UIMenu(title: "", children: [addCat, shareButton])
let menuBarItem = UIBarButtonItem(image: UIImage(systemName: "square.and.arrow.up"), menu: menu)
navigationItem.rightBarButtonItem = menuBarItem

インラインの日付ピッカーを表示

こちらが古い日付ピッカーです
oldDatePicker

こちらが新しい日付ピッカーです

newDatePicker.png

コード内で日付ピッカーのスタイルを変更することもできます

@IBOutlet weak var datePicker: UIDatePicker!
datePicker.preferredDatePickerStyle = .inline

コンパクト日付ピッカーを表示する

コンパクト日付ピッカーは、デフォルトで日付と時刻のラベルのみを表示します。ユーザーはクリックすると日付/時刻の選択を編集できます。

image.png

@IBOutlet weak var datePicker: UIDatePicker!
datePicker.preferredDatePickerStyle = .compact

カラーピッカーを表示する

image.png

func showColorPicker(){
    let colorPicker = UIColorPickerViewController()
    colorPicker.delegate = self
    self.present(colorPicker, animated: true, completion: nil)
}

ここではユーザーが選んだ色が分かります。

extension ViewController: UIColorPickerViewControllerDelegate {

    func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
        print("Selected color: \(viewController.selectedColor)")
    }

    func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
        print("Color picker has been closed")
    }

}

ゲームセンター用のフローティングウィンドウを表示

あなたのアプリやゲームがすでにゲームセンター (Game Center) 機能を使用している場合は、プレイヤーがクリックして自分の達成状況を閲覧できるフローティングウィンドウを追加することができます。

image.png

if let window = view.window {
    GKAccessPoint.shared.isActive = true
    GKAccessPoint.shared.location = .bottomTrailing
    GKAccessPoint.shared.parentWindow = window
}

image.png

フローティングGame Centerウィンドウを表示するためには、プレイヤーを認証する必要があります:

GKLocalPlayer.local.authenticateHandler = { vc, error in
    if let authVC = vc {
        self.present(authVC, animated: true, completion: nil)
    }
}

また、App Store Connect 内でGame Center機能を有効化し、フローティングGame Centerウィンドウを表示する前に少なくとも1つのゲーム達成項目を追加する必要があります。

より多くの面白い iOS 機能を見つけ次第、この記事の更新を続けていきます。 アップデートについては、 (Qiita & Twitter) でフォローをお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Carthageで使うXcode・Swiftのバージョンをコントロールする

最近複数の仕事をしていて、Xcodeのバージョンをいくつか使っているんですが
carthageでライブラリーアップデートしてSwiftバージョン違うって言われると辛いですよね
あれめちゃくちゃ長いんですよ
1日溶ける

本題

バージョンが合っていないとこういうエラーが出てきます

<unknown>:0: error: module compiled with Swift 5.2.4 cannot be imported by the Swift 5.1.2 compiler: /Users/XXXXX/ios/yyyyyy/Carthage/Build/iOS/Hoge.framework/Modules/Hoge.swiftmodule/x86_64-apple-ios-simulator.swiftmodule

現在使っているXcodeを確認する

xcode-select --print-path

変更する

sudo xcode-select --switch <path-to-beta-xcode>/Contents/Developer

参考
https://stackoverflow.com/questions/37867753/change-carthage-swift-version

Cocoapodsの場合

環境設定から変更できます

スクリーンショット 2020-07-09 0.32.59.png

これcarthageに反映されないんですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む