모달형식을꽤나 자주 쓰는 앱인데 ( present() )

모달을 띄우면 기존엔 풀스크린으로 깔끔히 보이던게 ios13에서는 상단에 이상한 모양의 카드? 형식처럼 모달이 표시된다.

 

멘붕상태에 빠지고 구글신님께 문의를해보니

 

"""

iOS 13.0부터 iOS에서는 UIModalPresentationAutomatic이 기본값이고, 이전 버전에서는 UIModalPresentationFullScreen입니다.

기본적으로 UIViewController는 UIModalPresentationAutomatic을 UIModalPresentationPageSheet로 해석하지만 다른 시스템 제공보기 컨트롤러는 UIModalPresentationAutomatic을 다른 구체적인 프리젠 테이션 스타일로 해석 할 수 있습니다.

"""

라고한다.

 

그리하여.

.modalPresentationStyle 을 풀스크린으로 변경해주면 

ios13에서도 정상적으로 뜬다.

 

물론 이것만으로 모든게 정상적으로 돌아가는게 아니였다.......

 

이유는 모르겠지만 컨테이너뷰로 만든애의 옆구리가 빈다....................

 

너네 왜그러니 ㅠㅠ

 

참고로 옆구리가 비어있는 문제는 ios13 xr 시뮬레이터 이상에서만 나온다.

기존 타겟으로 삼은 기기 6s에선 ios13으로도 문제없이 프린트가 된다.

 

도대체 뭐가 문제였을까

ios12로 돌리던 xr에선 문제없이 보이건만 슬플따름

 

이거에대한 문제가 해결되면 나중에 다시 관련내용으로 글을 작성할 예정이다.

 

 

 

==========================================================================

추가

 

옆구리가 비는 문제는 몇몇의 기기에서만 발생하는문제였다.

임시적으로

viewWillLayoutSubviews 에서 크기와 위치를 재설정해줘서 땜빵해놨다.

이 이후에 문제가 뭔지 발견하면 수정할 예정.

반응형

이번 프로젝트에서는 데이터가 날짜에 대한 항목이 여러군데에서 많이 쓰여

기본 타입의 확장으로 편리성을 높여봤습니다.

 

날짜 형식을 잘 파싱해서 Datecomponents에 넣어서 Date값을 반환해도 좋지만

Dateformat을 활용해 바꿔봤습니다.

 

extension String {
    func toDate() -> Date? { //"yyyy-MM-dd HH:mm:ss"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        if let date = dateFormatter.date(from: self) {
            return date
        } else {
            return nil
        }
    }
}

extension Date {
    func toString() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        return dateFormatter.string(from: self)
    }
}

 

따로 함수로 빼서 사용 하시려면 self 자리에 해당하는 내용을 적어주면 되겠네요 ㅎ

추가로 toString할때 타임존을 UTC 가 아니라 각 나라별로 하면

Date는 기본이 UTC라 각 나라의 시간대별 시간으로 바로 변환 하는걸로 써먹을수도 있을거같아요.

혹은 날짜형식 변환에도 써먹을수 있겠네요

년 월 일 시 분 초 있는 문자열을 월/일 시 - 분 문자열로 변환같은 기능으로요.

 

그럴일이 있을까 모르겠습니다만...

 

아무튼 위 소스의  사용은 아래와 같이 해봤습니다.

(참고로 이 애들은 전역 변수 쓰듯이 클래스 밖에다가 적어 주셔야합니다 extension 사용임을 잊지말아주세요.)

 

참고로 toDate()는 반환이 옵셔녈 타입이기에 한번 옵셔널을 벗겨주셔야합니다.

반응형

현재 연결된 WiFi의 SSID값을 받아와서 내가 연결하려한SSID와 같은지 비교해서

앱내에서 연결이 됐는지 확인하는 예제를 만들고 있었으나,

func currentSSIDs() -> [String] {
    guard let interfaces = CNCopySupportedInterfaces() as? [String] else {
        return []
    }
    return interfaces.compactMap { interfaceName in
        guard let info = CNCopyCurrentNetworkInfo(interfaceName as CFString) as? [String:AnyObject] else {
        	print("Point 0")
            return nil
        }
        guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {
        	print("Point 1")
            return nil
        }
        return ssid
    }
}

ps. 해당소스는 https://codeday.me/ko/qa/20190625/886103.html 를 보고 살짝 바꾼 코드이다.

(iOS11 이상부터?  단순 Nil값 제거는 flatMap 대신 compactMap 을 쓰는걸 권장하고있다)

 

currentSSIDs 의 값이 항상 nil이 나오고

console에 Point 0가 찍힌다.

 

처음에는 뭔가 키라던가 변경되어 값을 잘못 참조하고있는줄 알았다.

그렇게 키값 위주로 검색해보던중 우연찮게

잘못된곳은 그곳이 아니라는걸 알게되었고

문제는 아래 스택오버플로우의 글과 같았다.

 

https://stackoverflow.com/questions/50767946/systemconfiguration-captivenetwork-doesnt-work-on-ios-12 

 

테스트하고 있던 폰은 iOS12 로 WiFi 정보를 받아오려면

Project File -> Capabilities 의 Access WiFi Information 을 on으로 변경해줘야한다.

 

변경해주었더니 잘 받아옴....

반응형

excell 차트

 

iOS 타겟 버전 지원율

iOS12 이상 = 75%

iOS11 이상 = 92%

이하 잡다.   = 100%

 

 최소지원을 11버전으로 잡아도 무방하겠네요

 

 

자료 소스 -

 

https://kbench.com/?q=node/194882

 

애플 'iOS12' 점유율 75%…iOS11 점유율 17% | 케이벤치

애플이 지난해 9월 출시한 iOS12 운영체제(OS)가 전체 iOS 기기 가운데 75%에 설치된 것으로 조사됐다. 3일(한국시간) 애플은 개발자 지원 페이지를 업데이트하고 지난 1일 조사된 iOS 버전별 점유율을 공개했다. 애플 통계에 따르면 iOS12는 전체 아이폰, 아이패드 가운데 75%에 설치된 것으로 나타났다. iOS11 점유율은 17%를 기록했으며, iOS10 이전 OS를 설치한 기기는 8%인 것으로 나타났다. 지난 4년 동안 출시된 아이폰, 아

kbench.com

 

반응형

1044 : [기초-산술연산] 정수 한 개 입력받아 1 더해 출력하기 with Swift

41. 콘솔에서 정수를 한 개 입력 받아 1을 더해 출력하라.

입력 범위: -2147483648 ~ 2147483647

입력 예시

2147483647

출력 에시

2147483648

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
        scan.close();
		long printValue = (long) value0;
		System.out.println(++printValue);
	}
}

 

 

Swift 4.2

import Foundation

extension Int {
    static prefix func ++(_ x: inout Int) -> Int {
        x += 1
        return x
    }
}
let line = readLine()
if line != nil {
    if var value = Int(line!) {
        print(++value)
    }
}

 

 

이번 문제는 증감연산자를 사용해보는게 목적인 문제인듯하여

굳이 ++을 사용해봤습니다.

switf 4.2에선 해당 연사자가 디폴트로 존재하지 않기때문에 전위 증감 연산자로 Int에 한해서 사용하도록 추가해봤습니다.

솔직히 필요한가 싶기도 해요

사용후 증가 사용전 증가 뭐그런거 헷갈리기도하고...

https://codeup.kr/problem.php?id=1044

 

[기초-산술연산] 정수 한 개 입력받아 1 더해 출력하기

어떤 변수(a)에 값을 저장한 후  a+1 의 값을 출력할 수도 있고, ++a 후 출력할 수도 있다. ++a, --a, a++, a-- 와 같이 어떤 변수의 앞이나 뒤에 붙여 변수에 저장되어 있는 값을 1씩 더하거나 빼주는 연산자를 증감연산자라고 한다. 증감연산자를 변수 앞에 붙이면 그 변수를 사용하기 전에 증감을 먼저 수행하고, 증감연산자를 변수 뒤에 붙이면 일단 변수에 저장되어 있는 값을 먼저 사용하고 난 후에 증감을 수행한다.

codeup.kr

 

 

 

 

1045 : [기초-산술연산] 정수 두 개 입력받아 자동 계산하기 with Swift

42. 콘솔에서 정수 두 개(a,b)를 입력 받아 합,차,곱, 나머지, 나눈값을 출력하라.

입력 :

0 ~ 2147483647, b != 0

출력 :

1line : 두 수의 합

2line: 두 수의 차 (a - b)

3line: 두 수 의 곱

4line: a를 b로 나눈 몫

5line: a를 b로 나눈 나머지

6line: a를 b로 나눈 값( 실수, 소수점 셋째 자리에서 반올림해 둘째 자리까지 출력)

입력 예시

10 3

출력 예시

13

7

30

3

1

3.33

Java

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		long value0 = scan.nextInt();
		long value1 = scan.nextInt();
        scan.close();
		System.out.println(value0 + value1);
		System.out.println(value0 - value1);
		System.out.println(value0 * value1);
		System.out.println(value0 / value1);
		System.out.println(value0 % value1);
		double printValue = ((double) value0) / value1;
		System.out.println(String.format("%.2f", printValue));
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let values = line!.split(separator: " ")
    if values.count == 2 {
        if let value0 = Int(values[0]), let value1 = Int(values[1]) {
            print(value0 + value1)
            print(value0 - value1)
            print(value0 * value1)
            print(value0 / value1)
            print(value0 % value1)
            let floatValue = Float(value0) / Float(value1)
            print(String.init(format: "%.2f", floatValue))
        }
    }
}

 

 

 

휴일에 사무실에서 이게 뭐하는짓인지..

https://codeup.kr/problem.php?id=1045

 

[기초-산술연산] 정수 두 개 입력받아 자동 계산하기

정수 두 개(a, b)를 입력받아 합, 차, 곱, 몫, 나머지, 나눈값을 자동으로 계산해보자. (단 입력되는 정수 a, b의 범위는 0 ~ 2147483647이고, b는 0이 아니다.)

codeup.kr

 

 

 

1046 : [기초-산술연산] 정수 세 개 입력받아 합과 평균 출력하기 with Swift

43.콘솔에서 세 개의 정수를 입력받아 합과 평균을 출력하라.

입력 : 1line으로 공백으로 구분되어 3개의 정수가 입력됨 (입력 범위 : -2147483648 ~ -2147483647)

출력:

1line : 세 정수의 합

2line : 세 정수의 평균( 실수, 소수점 둘째 자리에서 반올림하여 첫째 자리까지 출력 )

입력 예시

1 2 3

출력 예시

6

2.0

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int [] values = new int [3];
		for (int i = 0; i < values.length; i++) {
			values[i] = scan.nextInt();
		}
        scan.close();
		if(values.length > 2) {
			long total = values[0] + values[1] + values[2];
			
			double avg = total / 3.0;
			System.out.println(total);
			System.out.println(String.format("%.1f", avg));
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let split = line!.split(separator: " ")
    if split.count == 3 {
        var values = [Int]()
        for s in split {
            if let value = Int(s) {
                values.append(value)
            }
        }
        if values.count == 3 {
            let total = values[0] + values[1] + values[2]
            let avg = Float(total) / 3.0
            print(total)
            print(String.init(format: "%.1f", avg))
        }
    }
}

 

 

뭐.. 이런곳에서는 의미는 없습니다만

보통 배열이라던가 반복이라던가 할때 직접적으로 숫자를 써서 위치를 입력받는건 위험한 일입니다.

최대한 자동으로되게 혹은 그값이 정말로 존재하는지에대해 검사를 해야합니다만

이런문제에선 의미가 없지요.

https://codeup.kr/problem.php?id=1046

 

[기초-산술연산] 정수 세 개 입력받아 합과 평균 출력하기

정수 세 개를 입력받아 합과 평균을 출력하는 프로그램을 작성해보자. (단, -2147483648 ~ 2147483647)

codeup.kr

 

반응형

1041 : [기초-산술연산] 문자 한 개 입력받아 다음 문자 출력하기 with Swift

38. 콘솔에서 영문자 한 개를 입력받아, 입력된 문자의 아스키코드값의 다음에 해당하는 문자를 출력하라.

입력 예시

a

출력 예시

b

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
        scan.close();
		char [] charArray = line.toCharArray();
		if(charArray.length > 0) {
			System.out.println((char) (charArray[0] + 1));
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let printValue = line!.first {
        let unicodes = printValue.unicodeScalars
        for uni in unicodes {
            if let printValue = Unicode.Scalar(uni.value + 1) {
                print(printValue)
            }
        }
    }
}

 

 

https://codeup.kr/problem.php?id=1041

 

[기초-산술연산] 문자 한 개 입력받아 다음 문자 출력하기

영문자 한 개를 입력받아, 그 다음 문자를 출력하는 프로그램을 작성해보자. 영문자 '$A$'의 다음 문자는 '$B$'이고, 문자 '$0$'의 다음 문자는 '$1$'이다.

codeup.kr

 

 

 

 

 

 

 

1042 : [기초-산술연산] 정수 두 개 입력받아 나눈 몫 출력하기 with Swift

39. 콘솔에서 정수 두 개(a,b)를 입력 받아 a를 b로 나눈 몫을 출력하라.

입력 범위: 0 ~ 2147483647

입력 예시

1 3

출력 예시

0

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
		int value1 = scan.nextInt();
        scan.close();
		if(value1 > 0) {
			System.out.println(value0/value1);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let array = line!.split(separator: " ")
    if array.count == 2 {
        if let value0 = Int(array[0]), let value1 = Int(array[1]) {
            if value1 > 0 {
                print(value0/value1)
            }
        }
    }
}

 

 

 

https://codeup.kr/problem.php?id=1042

 

[기초-산술연산] 정수 두 개 입력받아 나눈 몫 출력하기

C언어에서 a/b 연산의 결과는 a를 b로 나눈 몫이 계산된다. 실수/정수,  정수/실수,  (float)정수/정수,  정수/(float)정수  의 연산은 나눈 결과가 실수로 계산된다. (float)(정수/정수)는 정수/정수의 결과인 정수를 실수형(float)로 바꾸는 것으로, 정수가 실수 형태로 변환되는 것이니 주의한다. 정수/실수... 에서 계산 결과가 실수형으로 바뀌는 것과 같이 계산 결과의 데이터형이 자동으로 바뀌는 것을 묵시적 (데이터)형 변환이

codeup.kr

 

 

 

 

 

 

1043 : [기초-산술연산] 정수 두 개 입력받아 나눈 나머지 출력하기 with Swift

40. 콘솔에서 정수 두개(a,b)를 입력 받아 a를 b로 나눈 나머지를 출력하라.

입력범위: 0 ~ 2147483647

입력 예시

1 3

출력 예시

1

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
		int value1 = scan.nextInt();
        scan.close();
		if(value1 > 0) {
			System.out.println(value0%value1);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let array = line!.split(separator: " ")
    if array.count == 2 {
        if let value0 = Int(array[0]), let value1 = Int(array[1]) {
            if value1 > 0 {
                print(value0%value1)
            }
        }
    }
}

 

 

https://codeup.kr/problem.php?id=1043

 

[기초-산술연산] 정수 두 개 입력받아 나눈 나머지 출력하기

정수 두 개(a, b) 를 입력받아 a를 b로 나눈 나머지를 출력하는 프로그램을 작성해보자. (단, 두 개의 정수 a, b의 범위는 0 ~ 2147483647이고, b는 0이 아니다.)

codeup.kr

 

 

 

 

반응형

1038 : [기초-산술연산] 정수 두 개 입력받아 합 출력하기1 with Swift

35. 콘솔에서 두 개의 정수를 입력받아 합을 출력하라.

입력 : 한 줄에 공백으로 두개의 정수가 구분되어 입력된다. 입력되는 정수의 범위는 다음과 같다.

입력 범위 : -1073741824 ~ 1073741824

입력 예시

123 -123

출력 예시

0

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
		int value1 = scan.nextInt();
		scan.close();
		System.out.println(value0 + value1);
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let valueArray = line!.split(separator: " ")
    if valueArray.count == 2 {
        if let value0 = Int(valueArray[0]), let value1 = Int(valueArray[1]) {
            print((value0 + value1))
        }
    }
}

 

 

 

이번문제는 읽자마자 아! 많이 하는 실수인 계산시의 중간값이 범위를 오버하는걸 방지하는 문제이구나!

라고 생각했는데 밑의 단 범위는 이것이다 라고 바로 부정당했네요.

잠깐 이야기하자면

int 의 범위내의 입력값과

int의 범위 내의 출력값이 나온다고해도

그 중간값이 int의 범위내에 있다고 생각 할 수 없습니다.

중간식이 단순 연산이라면 금방 눈치를 채겠지만 막 복잡한 식이 들어가면 어느순간에 범위를 넘어서 버릴수도 있습니다.

물론 이러한 문제는 금방 디버깅시에 발견가능하지만 중간값을 생각안하면 디버깅툴에서 알려주는 라인의 오류를 이해를 못할 수 도 있기에

잠깐 이야기 해봤습니다.

https://codeup.kr/problem.php?id=1038

 

[기초-산술연산] 정수 두 개 입력받아 합 출력하기1

정수 2개를 입력받아 합을 출력하는 프로그램을 작성해보자. (단, 입력되는 정수는 -1073741824 ~ 1073741824 이다.)

codeup.kr

 

 

 

 

 

 

 

 

1039 : [기초-산술연산] 정수 두 개 입력받아 합 출력하기2 with Swift

36.콘솔에서 정수 두 개를 입력받아 합을 출력하라. 단 입력 되는 정수의 범위는 다음과 같다.

입력 범위 : −2147483648 ∼ 2147483647

입력: 두 개의 정수가 공백으로 구분되어 한 줄에 입력된다.

입력 예시

2147483647 2147483647

출력 예시

4294967294

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		long longValue = 0;
		for (int i = 0; i < 2; i++) {
			longValue += scan.nextInt();
		}
		scan.close();
		System.out.println(longValue);
	}
}

 

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let valueArray = line!.split(separator: " ")
    if valueArray.count == 2 {
        if let value0 = Int(valueArray[0]), let value1 = Int(valueArray[1]) {
            print( value0 + value1 )
        }
    }
}

 

 

 

스위프트가 이전 모든 값이 int범위였을때랑 같은 소스다! 잘못한거 아니냐! 라고 말할수 있겠으나

사실 스위프트의 기본 Int 범위는 상당히 넓다.

Swift 4.2 값 범위 - 소스

print("Int       : \(Int.min) ~ \(Int.max)")
print("Int8      : \(Int8.min) ~ \(Int8.max)")
print("Int16     : \(Int16.min) ~ \(Int16.max)")
print("Int32     : \(Int32.min) ~ \(Int32.max)")
print("Int64     : \(Int64.min) ~ \(Int64.max)")
print("UInt      : \(UInt.min) ~ \(UInt.max)")
print("UInt8     : \(UInt8.min) ~ \(UInt8.max)")
print("UInt16    : \(UInt16.min) ~ \(UInt16.max)")
print("UInt32    : \(UInt32.min) ~ \(UInt32.max)")
print("UInt64    : \(UInt64.min) ~ \(UInt64.max)")
print("CLong     : \(CLong.min) ~ \(CLong.max)")
print("CLongLong : \(CLongLong.min) ~ \(CLongLong.max)")
print("ULONG     : \(ULONG.min) ~ \(ULONG.max)")

 

 

Swift 4.2 값 범위 - 결과

Int : -9223372036854775808 ~ 9223372036854775807

Int8 : -128 ~ 127

Int16 : -32768 ~ 32767

Int32 : -2147483648 ~ 2147483647

Int64 : -9223372036854775808 ~ 9223372036854775807

UInt : 0 ~ 18446744073709551615

UInt8 : 0 ~ 255

UInt16 : 0 ~ 65535

UInt32 : 0 ~ 4294967295

UInt64 : 0 ~ 18446744073709551615

CLong : -9223372036854775808 ~ 9223372036854775807

CLongLong : -9223372036854775808 ~ 9223372036854775807

ULONG : 0 ~ 4294967295

대부분 보면 결국 Int32 아니면 Int64 범위입니다.

Swift 4.2에선 기본Int 범위가 Int64범위라 이번 문제에선 결국 중간값에대한 형을 변환안해줘되 되요

https://codeup.kr/problem.php?id=1039

 

[기초-산술연산] 정수 두 개 입력받아 합 출력하기2

+ 연산자를 사용하면 된다. 단, 계산된 결과가 int 데이터형의 표현 범위를 넘어가기 때문에 다른 데이터형을 사용해야 한다. [주의] int 데이터형은 %d로 입출력하고, long long int 데이터형은 %lld로 입출력한다.

codeup.kr

 

 

1040 : [기초-산술연산] 정수 한 개 입력받아 부호 바꿔 출력하기 with Swift

37. 콘솔에서 한 개의 정수를 입력받고 부호를 바꿔 출력 하라.

입력 범위: -2147483647 ~ 2147483647

입력 예시:

-1

출력 예시:

1

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value = scan.nextInt();
		scan.close();
		System.out.println(-value);
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let value = Int(line!) {
        print(-value)
    }
}

 

 

https://codeup.kr/problem.php?id=1040

 

[기초-산술연산] 정수 한 개 입력받아 부호 바꿔 출력하기

단항 연산자인 -(negative)를 변수 앞에 붙이면 부호가 반대로 바뀌어 계산된다. [예시] int a; scanf("%d", &a); printf("%d", -a);

codeup.kr

 

반응형

1034 : [기초-출력변환] 8진 정수 한 개 입력받아 10진수로 출력하기 with Swift

31. 콘솔에서 8진수를 한 개 입력받아 10진수로 출력하라.

입력 예시

13

출력 예시

11

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		String clean = line.trim();
		System.out.println(trans8to10(clean));
	}
	
	static public int trans8to10(String str8Value) {
		if(str8Value.length() < 1) {return -1; }
		if(!valueCheck(str8Value)) {
			return -1;
		} else {
			char [] numberArray = str8Value.toCharArray();
			int p = numberArray.length - 1;
			
			int result = 0;
			for (char number : numberArray) {
				int val = Integer.valueOf(String.valueOf(number));
				result += val * ((int) Math.pow(8, p));
				p--;
			}
			return result;
		}	
	}
	
	static public boolean valueCheck(String target) {
		try {
			Integer.valueOf(target);
			return true;
		} catch (Exception e) {
			System.out.println("Error : Main.valueCheck() ->" + e.getLocalizedMessage());
			return false;
		}
	}
}

 

 

Swift 4.2 

import Foundation

func trans8to10(strValue:String) -> Int{
    guard Int(strValue) != nil else { return -1 }
    
    var result = 0;
    var p:Double = Double(strValue.count - 1)
    for number in strValue {
        if let val = Int(String(number)) {
            result += val * Int(pow(Double(8), p))
        }
        p -= 1;
    }
    return result
}

let line = readLine()
if line != nil {
    print(trans8to10(strValue: line!))
}

좀 쓸모없는게 들어간거같고 비효율적으로 느껴집니다.

그렇지만 더 생각하기 귀찮아서 넘어가렵니다.

요즘 딱히 일이없어 잔심부름 같은일 외에 기초100문제 포스팅하다보니 어느새 1/3 지점에 도착해버렸습니다.

이번에도 하다가 그만두고 먼 미래로 남겨두겠지 했는데 페이스를 보니 다음 프로젝트가 저한테 할당되기전까지 놀랍게도 100문제까지 갈지도 모르겠다는 생각이 드네요.

ios13 발표되고 공부해야할게 늘었는데 공부하기 싫어서 이런거난 하고있으니

멀리서 저를 내려다보면 엄청 한심해 보일거같습니다.

https://codeup.kr/problem.php?id=1034

 

[기초-출력변환] 8진 정수 한 개 입력받아 10진수로 출력하기

int n; scanf("%o", &n); printf("%d", n); (한편, C언어에서 소스 코드 작성시 0으로 시작하는 수는 8진수로 인식된다.)

codeup.kr

 

 

 

 

1035 : [기초-출력변환] 16진 정수 한 개 입력받아 8진수로 출력하기 with Swift

32. 콘솔에서 16진수 정수 한 개를 입력받고 8진수로 바꾸어 출력하라.

입력 예시

f

출력 예시

17

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		String clean = line.trim();
		System.out.println(trans16to8(clean));
	}
	
	static public String trans16to8(String str16Value) {
		try {
			int converted = Integer.valueOf(str16Value, 16);
			return String.format("%o", converted);
		} catch (Exception e) {
			System.out.println("Err : trans16to8 -> " + e.getLocalizedMessage());
			return "";
		}
	}
}

 

Swift 4.2

 

import Foundation

func octalTrans(value:Int) -> [Int] {
    var flag = value
    var result = [Int]()
    
    while flag >= 8 {
        result.append(flag % 8)
        flag = flag / 8
        if flag < 8 { result.append(flag) }
    }
    
    result.reverse()
    return result
}

func alpaTransNumber(alpa:Character) -> Int? {
    switch alpa {
    case "a": return 10
    case "b": return 11
    case "c": return 12
    case "d": return 13
    case "e": return 14
    case "f": return 15
    default: return nil
    }
}

func trans16to10(strValue:String) -> Int?{
    let letters = CharacterSet.letters
    var result = 0;
    var p:Double = Double(strValue.count - 1)
    for number in strValue.unicodeScalars {
        if letters.contains(number) {
            if let val = alpaTransNumber(alpa: Character(number)) {
                result += val * Int(pow(Double(16), p))
            } else {
                print("Err : trans16to10 -> 잘못된 값이 입력됨")
                return nil
            }
        } else {
            if let val = Int(String(number)) {
                result += val * Int(pow(Double(16), p))
            } else {
                print("Err : trans16to10 -> 잘못된 값이 입력됨")
                return nil
            }
        }
        p -= 1;
    }
    return result
}

let line = readLine()
if line != nil {
    if let value = trans16to10(strValue: line!) {
        var printValue = String()
        for number in octalTrans(value: value) {
            printValue += String(number)
        }
        print(printValue)
    }
}

자바는 Integer.valueOf()에 저렇게 변환하는 기능이 있는지 몰랐네요 ㅋㅋㅋ

이전 소스도 다 수정하고싶지만 귀찮으니 그냥 남겨둡니다.

놀다가 우연하게 발견했네요. ㅎㅎ

그렇게 자바쪽은 코드가 확 줄었습니다.

valueOf에 진수 변환기능이 있는지 모르는분들을 위해 잠깐 끄적여 보자면

위 코드에서

int converted = Integer.valueOf(str16Value, 16);

에서 사용했는데,

str16Value라는 문자열이 사실 16진수야! 그러니 10진수로 바꿔주렴

라는 기능이 있다고하네요.

지금도 좀 헷갈려서 쓸날이 올지는 모르겠습니다.

자바를 잘 안만지기도 하니까요.

스위프트 코드는 이전 문제들 코드를 긁어와서 짜집기했습니다.

다시 짜기 귀찮아서요.

https://codeup.kr/problem.php?id=1035

 

[기초-출력변환] 16진 정수 한 개 입력받아 8진수로 출력하기

int n; scanf("%x", &n); //소문자로 16진수 입력 printf("%o", n); 한편, C언어에서 소스 코드 작성시 0x으로 시작하는 수는 16진수로 인식된다. 또한 소스코드 내에서 //로 시작하면 1줄 설명을 넣을 수 있다. 여러 줄을 설명(주석) 처리할 경우 /* 로 시작해 */로 끝나는 사이에 작성할 수 있다.

codeup.kr

 

 

 

 

1036 : [기초-출력변환] 영문자 한 개 입력받아 10진수로 출력하기 with Swift

33. 콘솔에서 영문자 한 개 를 입력받아 영문자의 아스키 코드 값을 출력해라.

입력 예시

A

출력 예시

65

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		byte[] bytes = line.getBytes();
		for (byte b : bytes) {
			System.out.println(b);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    for scalar in line!.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars {
        print(scalar.value)
    }
}

 

 

https://codeup.kr/problem.php?id=1036\

 

[기초-출력변환] 영문자 한 개 입력받아 10진수로 출력하기

아스키(ASCII, 미국표준코드, American Standard Code for Information Interchange) 코드표는 영문자, 특수문자 등을 사용할 때 사용하는 표준 코드이다. 컴퓨터로 저장되는 모든 데이터는 2진 정수화되어 저장되는데, 영문자와 특수기호 등을 저장하는 방법으로 아스키코드를 일반적으로 사용한다. 예를 들어 영문 대문자 'A'는 10진수 65에 해당하는 2진수 값으로 저장된다.

codeup.kr

 

 

 

 

1037 : [기초-출력변환] 정수 한 개 입력받아 아스키 문자로 출력하기 with Swift

34. 콘솔에서 10진 정수 한 개(0~255)를 입력 받아 아스키 문자로 출력해보라.

입력 예시

65

출력 예시

A

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int ascii_num = scan.nextInt();
		scan.close();
		System.out.println(String.format("%c", ascii_num));
	}
}

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let value = Int(line!){
        if let uni = Unicode.Scalar(value) {
            print(Character.init(uni))
        }
    }
}

 

문뜩 기초100제를 swift로 할만한 이유가 있을까? 라는 의문이 들었습니다.

https://codeup.kr/problem.php?id=1037

 

[기초-출력변환] 정수 한 개 입력받아 아스키 문자로 출력하기

10진 정수 한 개를 입력받아 아스키문자로 출력하는 프로그램을 작성해보자. (단, 0 ~ 255 범위의 정수만 입력된다.)

codeup.kr

 

 

반응형

+ Recent posts