Multi Developer SuHo

iOS 프로그래밍 4주차 Report 본문

Swift 과제물

iOS 프로그래밍 4주차 Report

Dreaming Developer Student 2023. 9. 26. 10:07
SMALL

Swift 3 버전에서 C-style 이 없어져서 오류가 난다

 

수정 소스

 

1부터 10 까지 출력

 

< 기호를 추가한 소스는  위에 소스 1...10 과 같

 

for var i in 1...5 { // for i in 0..<10 로 수정해야 함
    print("이수호")
} //error: C-style for statement has been removed in Swift 3

 

 

variable 'i' 변수를 사용할 수 없다 .  따라서 '_' (under score)를 쓴다

 

 

for i in 1...5 { // for i in 0..<10 로 수정해야 함
    print("i : 이수호")
    //i 라는 변수를 출력 할려면 (\(변수의 이름))을 사용한다
} //error: C-style for statement has been removed in Swift 3

범위 지정 연산자 

let names = ["A", "B", "C", "D"]
for x in names [2...] { // names 이라는 배열에 첨자 2부터 찍어달라는 것  
print(x) 
}

 

따라서 "C", "D" 가 출력된다

 

Swift 언어에서 dictionary 

 

let numberOfLegs = ["Spider": 8, "Ant": 6, "Dog": 4]
//dictionary는 key:value형식의 배열
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have \(legCount) legs")
}

 

// dictionary 는 순서가 없다

 

Swift 에서 dictionary 문법을 사용하는 언어들

 

Swift의 Dictionary는 키-값 쌍을 저장하는 컬렉션 타입입니다. 이와 유사한 기능을 가진 데이터 구조는 많은 프로그래밍 언어에서 찾아볼 수 있습니다. 여기에는 다음과 같은 언어들이 포함됩니다:

  1. Python: Dictionary Python에서 Dictionary는 키-값 쌍을 저장하는 데 사용됩니다. Python의 딕셔너리는 중괄호 {}를 사용하여 정의하고, 각 요소는 키: 값 형태로 표현합니다.
python
my_dict = {'key1': 'value1', 'key2': 'value2'}
print(my_dict['key1'])  # 출력: value1
  1. JavaScript: Object JavaScript에서 Object도 키-값 쌍을 저장하는 데 사용됩니다. JavaScript의 객체는 중괄호 {}를 사용하여 정의하고, 각 요소 역시 키: 값 형태로 표현합니다.
javascript
let myObj = {key1: 'value1', key2: 'value2'};
console.log(myObj.key1);  // 출력: value1
  1. Java: HashMap Java에서 HashMap 클래스를 사용하여 키-값 쌍을 저장할 수 있습니다.
java
import java.util.HashMap;

HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

System.out.println(map.get("key1"));  // 출력: value1
  1. C#: Dictionary C#에서도 Dictionary 클래스를 이용해 키-값 쌍을 저장할 수 있습니다.
csharp
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("key1", "value1");
dict.Add("key2", "value2");

Console.WriteLine(dict["key1"]);  // 출력 : value1 

이러한 데이터 구조들은 모두 Swift의 Dictionary와 비슷한 기능으로서, 데이터를 검색하거나 수정하는데 유용하게 사용됩니다.

 

Swift 에서 while 반복문

var myCount = 0
while myCount < 1000 {
myCount+=1
}
print(myCount) //결과는?

// 조건식의 () 괄호는 하지 않는다

 

for i in 1..<10 {
if i > 5   break

print(i) 
}

 

if 문 다음에 { } 를 써야한다는 에러

//if 문 다음에 간단한 문장이 하나라도 있더라도 반드시  {} (중괄호) 를 써야한다

 

오류 수정 소스

for i in 1..<10 {
if i > 5 {break}

print(i) 
}

//continue 문은 반복문의 상단 시작 위치로 돌아간다

 

Continue 문 소스

 

for i in 1...10 {
if i % 2 == 0 {
continue

print(i) 
}

 

Continue 문을 사용하는 프로그래밍 언어들 

continue 문은 반복문 내에서 현재의 반복을 중단하고 다음 반복으로 넘어가는 제어문입니다. 이는 다양한 프로그래밍 언어에서 사용되며, 일반적으로 for-loop나 while-loop 등의 반복문과 함께 사용됩니다.

다음은 continue 문을 지원하는 몇 가지 프로그래밍 언어들입니다:

  1. Python
python
for i in range(5):
    if i == 3:
        continue
    print(i)

위 코드는 0부터 4까지의 숫자를 출력하지만, i가 3일 때 continue 문에 의해 그 이후의 코드를 건너뛰므로 3은 출력되지 않습니다.

  1. JavaScript
javascript
for (let i = 0; i < 5; i++) {
    if (i === 3) {
        continue;
    }
    console.log(i);
}

이 JavaScript 코드도 Python 예제와 동일한 로직을 가지고 있습니다.

  1. Swift
swift
for i in 0..<5 {
    if i == 3 {
        continue
    }
    print(i)
}

이 Swift 코드 역시 위와 같은 로직을 수행합니다.

  1. Java
java
for (int i = 0; i < 5; ++i) {
    if (i == 3) {
        continue;
    }
    System.out.println(i);
}
  1. C++ / C# / C C++, C#, 그리고 C도 모두 continue 문을 지원합니다.

위와 같이 대부분의 프로그래밍 언어들이 continue 제어문을 지원하며, 해당 구조를 통해 불필요한 연산을 건너뛰거나 조건에 따라 특정 로직을 실행하지 않게 할 수 있습니다.


Swift 에서 비교 연산자 

var a = 1
var b = 2
var c = 3
var d = 4
if a < b && d > c { //비교연산자들이 우선순위가 높다   
print("yes")
}
if a < b, d > c { //과제, if문에서 콤마는 AND(&&)의 의미   

 

 

 

Swift 에서 콤마는 어떤 의미일까?

 

if a < b, d > c { //과제, if문에서 콤마는 AND(&&)의 의미   
print("yes")
}

Swift~case 문 마지막에 break 문이 자동으로 들어가는 프로그래밍 언어

Swift에서 if 문의 조건절에 콤마(,)를 사용하면 여러 조건을 동시에 검사할 수 있습니다. 이때 콤마는 논리 AND 연산자(&&)와 유사한 역할을 합니다.

즉, if a < b, d > c { ... } 코드에서 a < b와 d > c라는 두 가지 조건이 모두 참일 경우에만 중괄호 {} 안의 코드가 실행됩니다.

따라서 이 구문은 if a < b && d > c { ... }와 동일한 의미를 가집니다.

그러나 Swift에서 콤마를 사용하는 경우와 논리 AND 연산자를 사용하는 경우에는 약간의 차이가 있습니다. 콤마로 연결된 조건들은 왼쪽부터 오른쪽으로 순차적으로 평가되며, 한 번에 하나씩 평가합니다. 첫 번째 조건이 거짓인 경우 나머지 조건들은 평가되지 않습니다. 이는 논리 AND 연산자의 "단락 회로" 방식과 유사합니다.

하지만 콤마로 분리된 각각의 표현식은 옵셔널 바인딩(optional binding)과 같은 다른 구문을 포함할 수 있다는 점에서 차이점이 있습니다. 예를 들어, 아래와 같은 코드는 가능합니다:

swift

 

if let unwrappedValue = optionalValue, unwrappedValue < 10 {
    print("The unwrapped value is less than 10.")
}

위 코드에서 첫 번째 표현식은 옵셔널 바인딩을 수행하고, 그 결과값이 nil이 아니면 두 번째 표현식을 계속 평가합니다. 이런 식으로 여러 개의 옵셔널 바인딩과 일반적인 Boolean 표현식을 함께 사용할 수 있으므로 많은 유연성을 제공합니다.

 

 

 Swift 에서 

일부 프로그래밍 언어에서는 switch 문의 각 case 블록이 기본적으로 자동으로 분기를 종료하도록 설계되어 있습니다. 이러한 언어들에서는 각 case 뒤에 별도로 break를 쓰지 않아도 됩니다. 이런 특징을 가진 언어들 중 몇 가지를 다음과 같이 나열해 보겠습니다:

  1. Swift: Swift의 switch문은 각각의 case가 자동으로 break됩니다. 따라서, 일부러 fallthrough하려면 별도로 'fallthrough' 키워드를 사용해야 합니다.
swift
var num = 3
switch num {
case 3:
    print("Three")
default:
    print("Default")
}
  1. Kotlin: Kotlin 역시 Swift와 같이 switch 대신 when을 사용하지만, 각 case가 자동으로 break됩니다.
kotlin
var x = 1
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}
  1. Rust: Rust의 match 구문은 Swift의 switch 구문과 유사하며, 각 case가 자동으로 break됩니다.
rust
let number = Some(7);
match number {
    Some(i) if i % 2 == 0 => println!("Even"),
    Some(i) => println!("Odd"),
    _ => (),
}
  1. Go: Go 언어에서는 switch 문에 break 문을 작성하지 않아도 됩니다만, fallthrough 하고 싶다면 명시적으로 fallthrough 키워드를 사용해야 합니다.
go
i := 10

switch i {
case 10:
   fmt.Printf("i is equal to %d\n", i)
   fallthrough 
case 20:
   fmt.Printf("i is equal to %d\n", i)
default: 
   fmt.Printf("All I know is that i is an integer\n")
}

위 코드에서, 첫 번째 case인 "10"에 대한 조건이 참이므로 해당 코드블럭이 실행되고 'fallthrough' 키워드 때문에 바로 아래 있는 "20"에 대한 코드블럭까지 실행됩니다.

위와 같은 방식은 프로그램 로직을 좀 더 명확하게 만들며 실수로 인한 버그 발생 가능성을 줄여줍니다.

 

 

let anotherCharacter: Character = "a"
switch anotherCharacter { 
case "a": // Invalid, the case has an empty body
print("a글자");
case "A": 
print("A글자") 
default: 
print("A글자 아님") 
}
//error: 'case' label in a 'switch' should have at least one executable statement

 

var value = 3
var days : Int = 0
switch(value)
{
case 1,3,5,7,8,10,12:
print("31 일입니다")
case 4,6,9,11:
print("30 일입니다")
case 2:
print("28 or 29 일입니다")
default:
print("월을 잘못 입력하셨습니다")
}

// Case 문에 있는 숫자들의 연산자는  OR 연산자이다

 

Switch ~ case 문을 활용한 BMI 프로그램 프로그래밍

 

let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001) // kg/m*m 
var body: String

switch bmi {
case ..<18.5:
    body = "저체중"
case 18.5..<25:
    body = "정상"
case 25..<30:
    body = "1단계 비만"
case 30..<40:
    body = "2단계 비만"
default:
    body = "3단계 비만"
}

print("BMI:\(bmi), 판정:\(body)")

 

switch-case 문에서 Where 절 사용하는 소스

 

var temperature = 60
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}

 

 

var numbers: [Int] = [1, 2, 3, 4, 5]  
for num in numbers where num > 3 {
print(num)
}

where 절에 조건을 추가를 하게되면 switch,catch문 다양한 구문에서 사용이 가능하다

 

홀수를 출력하는 소스

var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num % 2 != 0 {
print(num)
}

 

짝수를 출력하는 소스

var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num % 2 == 0 {
print(num)
}

Swift에서  while 문을 사용하는 예제 소스

Swift에서 while문을 사용하는 예제를 아래에 제공하겠습니다. 이 예제는 1부터 시작하여 처음으로 1000을 넘는 수까지의 합을 계산합니다.

swift
var sum = 0
var i = 1

while sum <= 1000 {
    sum += i
    i += 1
}

print("The first number to exceed 1000 when summed from 1 is \(i-1).")

이 코드에서 while 문은 조건 sum <= 1000이 참인 동안 계속해서 실행됩니다. 각 반복마다 변수 sum에 i를 더하고, i 값을 하나씩 증가시킵니다. 이렇게 해서 누적된 합계인 sum 값이 처음으로 1000을 초과하면 조건이 거짓이 되어 반복문을 종료합니다.

결과적으로, 이 코드는 숫자들(1,2,3,...)을 더해 나갔을 때, 그 합계가 처음으로 1000을 넘게 만드는 그 숫자를 출력합니다.

 

swift에서 break 마다 감춰져 있어서 빠져나오지 못한다. case 별로 빠져 나가지 않고 계속 내려가게 하려면 fallthrough 문을 사용한다.

var value = 4
switch (value)
{
case 4:
print("4")
fallthrough
case 3:
print("3")
fallthrough
case 2:
print("2")
fallthrough
default:
print("1")
}

 

Swift에서 함수를 호출할 때 ()에 호출하는 실제 값을 argument 라고 한다

함수 정의부의 값을 매개변수(parameter)

 

메서드 :  특정 클래스. 구조체, 열거형 내의 함수

 

 

 

 

func sayHello() -> Void { //swift 에서 변수는 func 
    print("Hello")
}
sayHello() //함수를 정의하고 호출(call)

 

 

 

func sayHello() { //swift 에서 변수는 func 
    print("Hello")
}
sayHello() //함수를 정의하고 호출(call)

//리턴값이 없을때는 -> Void는 생략할 수 있다.

 

자료형을 알고 싶을때는 typeof 를 쓴다.

 

func sayHello() { //swift 에서 변수는 func 
    print("Hello")
}
sayHello() //함수를 정의하고 호출(call)
var x = 10
print(type(of:x))
print(type(of:sayHello)) // () -> ()  

// 빈괄호는 빈 튜플이다  typealias() 

 

C언어에서  Swift로 함수 변

func add(x:Int, y:Int) -> Int {
    return(x+y)
    
}
print(add(x:10,y:20))

 

 

 

 

func add(x: Int, y: Int) -> Int {
    return (x + y)
}

print(add(x: 10, y: 20))
print(type(of: add))  // (Int, Int) -> Int

func add1(first x: Int, second y: Int) -> Int {
    return (x + y)
}
print(add1(first: 10, second: 20)) // argument label, parameter 앞에 오는 것은 외부에서 사용하는 label을 쓰고, 뒤에 오는 것은 parameter
print(type(of: add1))  // (Int, Int) -> Int

// 외부 매개변수가 생략되면 argument label이 내부외부 동시에 쓰인다
func add2(_ x: Int, _ y: Int) -> Int {
    return (x + y)
}
print(add2(10, 20))
print(type(of: add2)) // (Int, Int) -> Int

func add3(_ x: Int, with y: Int) -> Int {
    return (x + y)
}
print(add3(10, with: 20))
print(type(of: add3)) // (Int, Int) -> Int

 

 

func add(x:Int, y:Int) -> Int {
  print(#function)
    return(x+y)
    
}
print(add(x:10,y:20))
// print(type(of:add))  //(Int, Int) -> Int  
// 함수의 자료형이라는 것은 ()매개변수에 자료형을 () -> return 형을 쓴다.
func add1(first x: Int, second y: Int) -> Int {
    print(#function)
return(x+y) 
}
print(add1(first:10,second:20)) 
//argument label , parameter 앞에 오는 것은 외부에서 사용하는 label 를 쓰고 뒤에 오는 것은  parameter
// print(type(of:add1))
// 외부 매개변수가 생략되면  argument label이 내부외부  동시에 쓰인다

func add2(_ x: Int, _ y: Int) -> Int {
    print(#function)
return(x+y) 
}
print(add2(10,20)) 
// print(type(of:add2)) 

func add3(_ x: Int, with y: Int) -> Int {
    print(#function)
return(x+y)
}
print(add3(10,with:20))
// print(type(of:add3))

//add 1,2,3, 의 자료형은 모두 같다

 

// add 함수는 외부 함수가 없다

//add1 외부 매개변수가 있어서 외부 매개변수로 나열

//add2 외부 매개변수가 없어서  (_:_:) 출력

//add3  (_:with:) 출력

// 콜론에 갯수 가 매개변수 수다.

 

매개변수를 콜론으로 나열한다. 함수명 출력

https://developer.apple.com/documentation/swift/print(_:separator:terminator:) 

 

print(_:separator:terminator:) | Apple Developer Documentation

Writes the textual representations of the given items into the standard output.

developer.apple.com

 

LIST