Swift-여러 줄로 문자열 나누기


265

아래와 같이 여러 줄로 문자열을 나눌 수 있습니까?

var text:String = "This is some text
                   over multiple lines"

줄을 여러 줄 문자열로 자동 변환하려면 약간 관련된 스레드에 대한 답변을 참조하십시오.이 여러 줄 문자열 리터럴 매크로를 Swift에서 어떻게 구현할 수 있습니까?
holroy

답변:


444

Swift 4에는 여러 줄 문자열 리터럴 지원이 포함되어 있습니다. 줄 바꿈 외에도 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.

var text = """
    This is some text
    over multiple lines
    """

이전 버전의 Swift에서는 여러 줄에 단일 리터럴을 사용할 수 없지만 여러 줄에 리터럴을 함께 추가 할 수 있습니다.

var text = "This is some text\n"
         + "over multiple lines\n"

2
그 접근 방식의 문제는 Swift에서 너무 많은 '계속 된'행에 쉽게 도달 할 수 있다는 것입니다 (Xcode 6.2 베타 기준). 더 간단한 표현으로. 그것은 추악하지만 달성하기에 충분히 쉽습니다. 단면을 괄호로 감싸십시오.
clearlight December

8
닫는 따옴표와 + 사이에 공백을 추가하는 것을 잊지 마십시오. 그렇지 않으면 " '+'는 접미사 단항 연산자가 아닙니다"라는 오류가 발생합니다.
Orlin Georgiev

여전히 작동하지만 \n캐릭터 를 수동으로 추가해야 합니다. 예를 들어 REPL : println("foo\n" + "bar")인쇄 foobar별도의 줄에.
브라이언 거슬러

Xcode 7에서 수정되어야합니다. "여러 줄을 포함하여 Swift 문자열 리터럴의 연결은 -Onone에서도 컴파일 타임 최적화를 보장합니다." adcdownload.apple.com/WWDC_2015/Xcode_7_beta/…
Kostiantyn Koval

2
합니까 열거 케이스 값을하지 작업이 사용하는 문자열 :(
라스 Blumberg

32

컴파일러에 매달려있는 버그를 피하면서 여러 줄 문자열을 달성하기 위해 String 확장을 사용했습니다. 또한 파이썬의 join 함수처럼 조금 사용할 수 있도록 구분 기호를 지정할 수 있습니다

extension String {
    init(sep:String, _ lines:String...){
        self = ""
        for (idx, item) in lines.enumerated() {
            self += "\(item)"
            if idx < lines.count-1 {
                self += sep
            }
        }
    }

    init(_ lines:String...){
        self = ""
        for (idx, item) in lines.enumerated() {
            self += "\(item)"
            if idx < lines.count-1 {
                self += "\n"
            }
        }
    }
}



print(
    String(
        "Hello",
        "World!"
    )
)
"Hello
World!"

print(
    String(sep:", ",
        "Hello",
        "World!"
    )
)
"Hello, World!"

1
이 방법들은 완벽합니다. 최신 1.2 Swift 릴리스에서도 긴 리터럴은 매우 느리게 컴파일되며 이러한 메소드는 이러한 오버 헤드를 피합니다.
phatmann

2
Swift 2를 사용하는 사람이라면 enumerate(lines)지금lines.enumerate()
Jedidja

2
@ mcornell 이것은 훌륭하지만 joinWithSeparator본질적으로 같은 일을하지 않습니까? ["Hello", "World!"].joinWithSeparator(", ")
Dan Loewenherz

27

이것은 내가 주목 한 Swift에 대한 첫 번째 실망스러운 일이었습니다. 거의 모든 스크립팅 언어는 여러 줄 문자열을 허용합니다.

C ++ 11은 원시 문자열 리터럴을 추가하여 은 고유 한 종결 정의

C #에는 여러 줄 문자열에 대한 @literals 가 있습니다.

일반 C와 구식 C ++ 및 Objective-C조차도 여러 리터럴을 인접한 곳에 두어 연결을 허용하므로 따옴표가 축소됩니다. 공백 문자는 그렇게 할 때 계산되지 않으므로 다른 줄에 넣을 수는 있지만 직접 줄 바꿈을 추가해야합니다.

const char* text = "This is some text\n"
                   "over multiple lines";

swift는 텍스트를 여러 줄에 넣었다는 것을 알지 못하므로 C 샘플과 마찬가지로 connor의 샘플을 수정하여 개행을 명시 적으로 설명해야합니다.

var text:String = "This is some text \n" +
                  "over multiple lines"

4
나는 이것에 한계가 있다고 확신합니다. 문자열을 13 줄 이상으로 분할하려고 시도했습니다 (여러 줄 정보 텍스트입니다). 컴파일을 마치지 못했을뿐 아니라 내 Mac을 무릎에 꿇었습니다. 내가 말했듯이, 나는 이것이 문제라고 범주 적으로 말할 수는 없지만 그 영향은 꽤 나쁘다는 것을 명심하십시오.
Derek Knight

컴파일하기 전에 여러 번 충돌했습니다. 구문 강조 및 코드 완성을 담당하는 "SourceKitService"프로세스 (이것도 충돌)를 담당한다고 생각합니다.
Paul Brewczynski

@DerekKnight 언어 제한이 아닌 컴파일러 버그입니다. 여전히 지속되면 레이더를 제출해야합니다.
radex

@bluesm 참고 : SourceKit은 별도의 프로세스이므로 Xcode와 충돌 할 수 없습니다. 구문 강조 및 코드 완성은 정확하지만 현재 컴파일 자체는 Xcode 프로세스에 있습니다. 따라서 컴파일러 버그로 인해 Xcode 자체가 다운되는 경우가 있습니다. (
radex

17

Swift 4.0부터 여러 줄 문자열이 가능하지만 몇 가지 규칙이 있습니다.

  1. 세 개의 큰 따옴표로 문자열을 시작하고 끝내야합니다. """ .
  2. 문자열 내용은 자체 줄에서 시작해야합니다.
  3. 종료 """는 자체 라인에서 시작해야합니다.

그 외에는 가도 좋습니다! 예를 들면 다음과 같습니다.

let longString = """
When you write a string that spans multiple
lines make sure you start its content on a
line all of its own, and end it with three
quotes also on a line of their own.
Multi-line strings also let you write "quote marks"
freely inside your strings, which is great!
"""

자세한 내용은 Swift 4의 새로운 기능 을 참조하십시오.


불행히도 이것은 Xcode 8.3.3 Playground에서 작동하지 않습니다. "무단 문자열"오류가 발생합니다.
제임스 포스터

내가 말했듯이이 기능은 Swift 4의 새로운 기능입니다. Swift 4 툴체인을 Xcode 8.3.3에 설치하거나 Xcode 9를 설치하십시오.
TwoStraws

16

litso가 지적했듯이 +한 표현식에서 -Operator를 반복해서 사용 하면 XCode Beta가 중단 될 수 있습니다 (XCode 6 Beta 5로 확인) .Xcode 6 Beta 컴파일되지 않음

현재 여러 줄 문자열의 대안은 reduce다음과 함께 문자열 배열을 사용하는 것입니다 +.

var text = ["This is some text ",
            "over multiple lines"].reduce("", +)

또는 다음을 사용하여 더 간단합니다 join.

var text = "".join(["This is some text ",
                    "over multiple lines"])

Reduce 버전은 베타 6에서 나에게 도움이되었지만 조인은 예외를 던졌습니다.
Tristan Warner-Smith

9

Swift 4는 멀티 라인 문자열 리터럴 지원을 제공하여이 문제를 해결했습니다. 메모장이나 텍스트 편집기로 작성하는 것과 같습니다. 여러 줄 문자열 리터럴을 다시 끝내려면 새 줄에 (”””)를 쓰십시오.

아래 예 참조

     let multiLineStringLiteral = """
    This is one of the best feature add in Swift 4
    It let’s you write “Double Quotes” without any escaping
    and new lines without need of “\n”
    """

print(multiLineStringLiteral)

5

빠른:

@connor가 정답이지만 원하는 것을 print 문에 행을 추가하려는 경우 is \n및 / 또는 \r이스케이프 시퀀스 또는 이스케이프 문자라고하며, 이 항목에 대한 Apple 설명서의 링크입니다. .

예:

print("First line\nSecond Line\rThirdLine...")

6
이것은 누군가가 원하는 것이 아닙니다. 우리 는 문자열 리터럴 의 소스 코드 에 줄 바꿈을 할 수 있기를 하지만 렌더링 된 출력 에 줄 바꿈이 필요하지 않습니다 . 이것은 원래 질문에서 꽤 분명했습니다. 긍정적 인 점수를받은 사람들은 분명히 이해했습니다. 부정적인 점수를 가진 사람들은 분명히 그렇지 않았습니다.
ArtOfWarfare

5
@ArtOfWarfare 이것은 내가 찾은 대답이며이 페이지는 "new line swift string"을 검색 할 때 최고의 결과였습니다. 분명히, 당신이 말하는 것처럼 분명하지 않습니다.
존 R 페리

4

@Connor 답변에 추가하려면 \ n도 있어야합니다. 다음은 수정 된 코드입니다.

var text:String = "This is some text \n" +
                  "over multiple lines"

3

다음 예제는 Xcode 6.2 Beta에서 Swift 버그에 대한 간단한 해결 방법으로 괄호를 사용하여 여러 줄 연속을 보여줍니다. 여기서 표현이 너무 복잡하여 합리적인 시간 내에 해결하기가 어렵고 더 작은 것으로 세분화하는 것이 좋습니다 조각 :

    .
    .
    .
    return String(format:"\n" +
                    ("    part1:    %d\n"    +
                     "    part2:    %d\n"    +
                     "    part3:  \"%@\"\n"  +
                     "    part4:  \"%@\"\n"  +
                     "    part5:  \"%@\"\n"  +
                     "    part6:  \"%@\"\n") +
                    ("    part7:  \"%@\"\n"  +
                     "    part8:  \"%@\"\n"  +
                     "    part9:  \"%@\"\n"  +
                     "    part10: \"%@\"\n"  +
                     "    part12: \"%@\"\n") +
                     "    part13:  %f\n"     +
                     "    part14:  %f\n\n",
                    part1, part2, part3, part4, part5, part6, part7, part8, 
                    part9, part10, part11, part12, part13, part14)
    .
    .
    .

0

미리 정의 된 텍스트와 함께 문자열 변수를 사용하려는 경우 다른 방법으로,

var textFieldData:String = "John"
myTextField.text = NSString(format: "Hello User, \n %@",textFieldData) as String
myTextField.numberOfLines = 0

0

유니 코드 equals를 사용하여 입력하거나 \n문자열 내부에서 구현할 수 있습니다. 예를 들면 다음과 같습니다 \u{0085}..


0

견본

var yourString = "first line \n second line \n third line"

+ 연산자가 적합하지 않은 경우


0

한 가지 방법은 레이블 텍스트를 duetText로 설정하고 줄 바꿈을위한 HTML을 포함하도록 문자열 변수를 업데이트하는 것입니다 (<br /> ).

예를 들면 다음과 같습니다.

var text:String = "This is some text<br />over multiple lines"
label.attributedText = text

산출:

This is some text
over multiple lines

도움이 되었기를 바랍니다!


속성 (label.attributedText)에 String값 (텍스트)을 할당 할 수 없습니다 NSAttributedString?.
Maxime Ashurov

0

다음은 문자열을 행으로 구분 된 n 개의 문자로 나누는 코드 스 니펫입니다.

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {

        let str = String(charsPerLine: 5, "Hello World!")
        print(str) // "Hello\n Worl\nd!\n"

    }
}

extension String {

    init(charsPerLine:Int, _ str:String){

        self = ""
        var idx = 0
        for char in str {
            self += "\(char)"
            idx = idx + 1
            if idx == charsPerLine {
                self += "\n"
                idx = 0
            }
        }

    }
}

-3

몇 가지 방법을 시도했지만 더 나은 해결책을 찾았습니다. "텍스트보기"요소 만 사용하십시오. 텍스트가 여러 줄로 자동 표시됩니다! 여기에서 찾을 수 있습니다 : UITextField 여러 줄


(여러분이 알다시피, downvotes는 아마도 UI가 아닌 코드 형식에 관한 질문 이었기 때문일 것입니다. 그리고 답변에 코드 샘플을 제공하면 아마도 더 분명했을 것입니다)
benc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.