본문 바로가기

swift

(34)
100DaysOfSwiftUI - Day 16 WeSplit 첫번째 프로젝트 var body: some View { } 는 swift 문법적으로는 computed property 인 것 같다. @State 를 추가하여, immutable 프로퍼티를 변경이 가능하도록 만들어준다. struct 가 아닌 다른 어느 곳에 저장한다고 하는데... 어딜까. @State 를 추가하지 않고, 버튼핸들러에서 프로퍼티를 변경하려 하면, View 가 immutable 이기 때문에 에러메시지가 발생하는 걸 보여주는 설명이 참 좋았다. 안그랬으면 그냥 그런갑다 하고 넘어갔을 것. https://daewonyoon.tistory.com/440
[Swift] error: ambiguous use of 'split(separator:maxSplits:omittingEmptySubsequences:)' 너무 간단한 코드를 짜는데, 너무 이상한 에러가 발생했다. 코드가 풀려고 하는 문제는 문자열을 단어별로 분리해서, 가장 짧은 단어의 길이를 찾는 것이다. 빈칸이 포함된 어느정도 길이의 문자열이 인자로 주어지고, 빈칸으로 단어가 나누어진다. 푸는 알고리즘은 간단하다 주어진 문자열을 빈칸으로 나누어 ( spllit 메소드 ) 단어의 시퀀스로 만든다 시퀀스의 각 단어의 길이를 .count 로 구한다. 이를 매핑해서 단어길이의 시퀀스로 변환한다. 단어길이의 시퀀스에서 가장 작은 것을 .min() 으로 구한다. 코드를 보면 한줄로 끝이 난다. (아래 코드는 가독성을 위해 줄바꿈을 추가.) func find_short(_ str: String) -> Int { return str.split(separator: " ..
[Swift] Counter 구현하기 via codewars codewars 를 풀다가 한줄짜리 카운터 구현이 있어서 옮겨본다. 한눈에 이해가 안 되서 옮겨보는 것임. 카운터라고 하면, 일련의 시퀀스 (리스트, 어레이로 주어진) 가 주어지고, 각각의 갯수를 세는 것을 말한다. python 에는 collections 에 Counter 라는 클래스를 간단히 이용하면 된다. 코드는 다음과 같다. func counter(_ seq: [Int]) -> [Int:Int] { return Dictionary( seq.map { ($0, 1) }, uniquingKeysWith: +) } // ViacheslavTronewsky@codewars 딕셔너리는 두개짜리 튜플의 시퀀스를 받아서, 딕셔너리로 바꿔주는데, 중복되는 키가 있을 때 어떻게 처리할지를 결정하는 인자가 uniqu..
[Swift] swift 단일 스크립트 파일을 컴파일하기 command line arguments 들을 처리하는 기능을 간단한 .swift 스크립트를 작성하여 테스트하려 했다. 간단한 테스트코드들은 컴파일한 실행파일이 아닌, 스크립트로 형식으로 실행하여 테스트하였었는데, 스크립트로 실행할 때에는, 신경쓰지 않았던 많은 실행인자들이 부가적으로 붙어 있었다. 메인 실행파일도 스크립트파일이 아니었다. 그래서, 스크립트 소스를 컴파일하여 단일 실행파일을 만들 수 있는 방법이 있는지 찾아봤다. 아주 간단하게 가능하다. swiftc my_script.swift -o my_program my_script.swift 파일을 컴파일 하려면, 셸에서 위와 같이 실행하면, my_program 이란 이름의 실행파일이 만들어진다. 컴파일러라서 swift 가 아닌 마지막에 c 자가 붙..
Swift 북마크 스위프트 동시성에 대한 모든것 1, 2017년 8월 포스팅 (추가일 : 2022-06-21) https://blog.canapio.com/128 리눅스에서의 스위프트 개발 (스위프트 설치, vscode 설정 등등) (추가일 : 2022-06-08) https://www.raywenderlich.com/8325890-a-complete-guide-to-swift-development-on-linux Pipe Child Process Together https://forums.swift.org/t/pipe-child-processes-together/12527 Running Child Process with Standard Input and Output https://developer.apple.com/fo..
[Swift] dependency <library> in target <project> requires explicit declaration; reference the package in the target dependency with '.product(name: <library>, package: <library package>)' swift package를 사용해서 프로젝트를 생성하고, Package.swift 에 필요한 디펜던시 package 를 추가하는 연습을 하는 중에, 아래와 같은 에러가 발생했다. 생성한 프로젝트는 Banner 라는 이름의 프로젝트였고, swift-argument-parser 의 ArgumentParser 를 이용하려고, Package.dependencies 에 .package(url: "https://github.com/apple/swift-argument-parser", from: "0.0.1"), 을 추가했다. 그리고, Package.targets.executableTarget.dependencies 에 "ArgumentParser"를 추가했다. 이렇게 추가한 Package.swift 파일은 다음과 ..
Swift Closure error: ambiguous use of operator 기초문법을 훑고 있습니다. closure 라는 것이 나와서, 가장 간단한 축약표현을 한번 써보고 싶었습니다. 그런데, error: ambiguous use of operator '+' 라는 에러가 발생하네요. 코드는 아래와 같습니다. for ab in [ [1,2], [3,4] ] { let a = ab[0] let b = ab[1] for op in [ { $0+$1 }, { $0-$1 } ] { print(a, b, op(a, b)) } } 코드의 의도는 정수쌍에 대해서 더하기도 해보고, 빼기도 해보고 그 결과값을 확인해 보는 겁니다. 더하기와 빼기 같은 연산자를 for 루프에 돌려보기 위해서, closure 를 만들어 썼습니다. 에러메시지는 for op in 라인에서 { $0+$1 } 부분의 + 를..
Swift codewars 연습문제 gravity swift 문법을 배우면서 연습을 하기 위해서, codewars 문제를 몇 개 풀어보기 시작함. gravity 라는 문제를 풀어봤다. 그냥 숫자로 주어진 리스트를 L 또는 R 인자에 따라 ascending, descending 으로 sort한 결과를 리턴하는 함수를 짜면 된다. 내 풀이는 다음과 같다. func flip(_ direction:String, _ a: [Int]) -> [Int] { if direction == "L" { return a.sorted(by: >) } return a.sorted(by: 와 < 라는 두 람다 중에 하나를 선택하게 했다. 람다를 3항연산자로 선택가능하고 (그것도 간단한 신택스로) 코드가 예뻐서 블로그에서 한번 언급하고 싶었다. codewars 를 풀면, 풀어내는 ..