พิมพ์โดยไม่ขึ้นบรรทัดใหม่อย่างรวดเร็ว


110

ใน swift 2.0 print()จะเพิ่มอักขระขึ้นบรรทัดใหม่โดยอัตโนมัติ ใน Swift 1.2 println()และprint()เคยเป็นฟังก์ชันแยกกัน ดังนั้นฉันจะพิมพ์ข้อความและไม่เพิ่มบรรทัดใหม่ได้อย่างไรเนื่องจาก swift ไม่มีฟังก์ชันการพิมพ์ที่ไม่ต่อท้ายบรรทัดใหม่อีกต่อไป



3
@ DánielNagyไม่ซ้ำกันเนื่องจาก swift 2.0 ไม่มีฟังก์ชัน println ฉันไม่ได้ถามว่าจะพิมพ์ลงคอนโซลอย่างไรเพราะฟังก์ชันการพิมพ์จะทำเช่นนั้น ฉันกำลังถาม "วิธีการพิมพ์ไปยังคอนโซลโดยไม่ต้องขึ้นบรรทัดใหม่ต่อท้ายเพื่อป้อนข้อความ"
Ankit Goel

2
สิ่งนี้ได้รับการบันทึกไว้อย่างชัดเจนในบันทึกประจำรุ่น Xcode 7 beta: "println และ print ถูกรวมเข้าด้วยกันเป็นฟังก์ชันการพิมพ์เดียวโดยมีอาร์กิวเมนต์เริ่มต้น ... "
Martin R

คำตอบ:


208

เริ่มต้นใน Swift 2.0 วิธีการพิมพ์ที่แนะนำโดยไม่ขึ้นบรรทัดใหม่คือ:

print("Hello", terminator:"")

แม้ว่าคุณจะเห็นเฉพาะอินเทอร์เฟซที่มีseperatorพารามิเตอร์ คุณสามารถเพิกเฉยได้เพราะมีค่าเริ่มต้นfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian

2
ในเอกสาร Swift จะมีคนรู้ว่าอะไรdefaultเท่ากับอะไร?
7stud

1
@ 7stud defaultเป็นตัวยึดสำหรับค่าเริ่มต้น ตามหลักการแล้วเอกสารควรมีค่าที่แท้จริงไม่ใช่ตัวยึดตำแหน่ง
Sulthan

1
ค่าเริ่มต้นคือ: ตัวคั่น "" (ช่องว่างเดียว) และเทอร์มิเนเตอร์ \ n (บรรทัดใหม่)
selva

68

printฟังก์ชั่นได้เปลี่ยนไปอย่างสิ้นเชิงตั้งแต่การปรับปรุงSwiftในช่วงปลายตอนนี้มันดูง่ายขึ้นมากและมีวิธีการพิมพ์ลงคอนโซลมาตรฐานที่แตกต่างกัน

ลายเซ็นวิธีสำหรับการพิมพ์มีลักษณะเช่นนี้

public func print<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream

และนี่คือกรณีใช้งานบางส่วน

print("Swift is awesome.")
print("Swift", "is", "awesome", separator:" ")
print("Swift", "is", "awesome", separator:" ", terminator:".")

พิมพ์:

Swift is awesome.
Swift is awesome
Swift is awesome.

การเชื่อมต่อ

print("This is wild", terminator: " ")
print("world")

พิมพ์:

This is wild world

ดังนั้นการใช้เทอร์มิเนเตอร์คุณควรระมัดระวังว่าเนื้อหาเกี่ยวข้องกับบรรทัดเดียวกัน

การพิมพ์วัตถุด้วยCustomStringConvertible

struct Address {
  let city: String
}

class Person {
  let name = "Jack"
  let addresses = [
    Address(city: "Helsinki"),
    Address(city: "Tampere")
  ]
}

extension Person: CustomStringConvertible {
  var description: String {
    let objectAddress = unsafeBitCast(self, to: Int.self)
    return String(format: "<name: \(name) %p>", objectAddress)
  }
}

let jack = Person()
print(jack)

พิมพ์:

<name: Jack 0x608000041c20>

CustomDebugStringConvertible

extension Person: CustomDebugStringConvertible {
  var debugDescription: String {
    let objectAddress = unsafeBitCast(self, to: Int.self)

    let addressString = addresses.map { $0.city }.joined(separator: ",")
    return String(format: "<name: \(name), addresses: \(addressString) %p>",objectAddress)
  }
}

ตอนนี้ด้วยlldbคุณสามารถใช้ คำสั่งpoและมันจะพิมพ์วัตถุเช่นนี้ในคอนโซล lldb

<name: Jack, addresses: Helsinki,Tampere 0x60c000044860>

เข้าสู่ไฟล์โดยใช้TextOutputStream

struct MyStreamer: TextOutputStream {

  lazy var fileHandle: FileHandle? = {
    let fileHandle = FileHandle(forWritingAtPath: self.logPath)
    return fileHandle
  }()

  var logPath: String = "My file path"

  mutating func write(_ string: String) {
    fileHandle?.seekToEndOfFile()
    fileHandle?.write(string.data(using:.utf8)!)
  }
}

ตอนนี้ใช้การพิมพ์เพื่อสตรีม

print("First of all", to: &myStream )
print("Then after", to: &myStream)
print("And, finally", to: &myStream)

พิมพ์เป็นไฟล์:

First of all
Then after
And finally

กำหนดเอง

extension Person: CustomReflectable {
  var customMirror: Mirror {
    return Mirror(self, children: ["name": name, "address1": addresses[0], "address2": addresses[1]])
  }
}

ตอนนี้ในดีบักเกอร์ lldb ถ้าคุณใช้คำสั่ง po

> po person

ผลลัพธ์จะเป็นแบบนี้

<name: Jack, addresses: Tampere Helsinki  0x7feb82f26e80>
  - name : "Jack"
  ▿ address1 : Address
    - city : "Helsinki"
  ▿ address2 : Address
    - city : "Tampere"

ยังไม่ทำงานสำหรับฉันใน Xcode 7beta4 เรียกprint("foo", appendNewLine: false)คอมไพล์ แต่ผลลัพธ์เป็น(foo), falseและบรรทัดใหม่จะถูกต่อท้าย!
mluisbrown

@mluisbrown มันappendNewline(ตัวพิมพ์เล็กl)
JeremyP

11

ใน Swift 2.0 คุณสามารถทำได้:

รุ่นพื้นฐาน

print("Hello World")
result "Hello World\n"

การใช้เทอร์มิเนเตอร์

print("Hello World", terminator:"")
result "Hello World"

ใช้ตัวคั่น

print("Hello", "World", separator:" ")
result "Hello World\n"

การใช้ตัวคั่นและเทอร์มิเนเตอร์

print("Hello", "World", separator:" ", terminator:"")
result "Hello World"

ใช้ตัวแปรเดียว

var helloworld = "Hello World"
print(helloworld)
result "Hello World\n"

ใช้สองตัวแปร

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"

โดยค่าเริ่มต้นตัวคั่นคือช่องว่าง" "
Jayram Kumar

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.