in nhanh chóng không có dòng mới


110

Trong swift 2.0, print()tự động thêm một ký tự dòng mới. Trong swift 1.2, println()print()từng là các chức năng riêng biệt. Vậy làm cách nào để in một số văn bản và không thêm dòng mới vào nó vì swift không còn chức năng in không nối dòng mới.



3
@ DánielNagy Nó không phải là bản sao vì swift 2.0 không có chức năng println. Tôi không hỏi làm thế nào để in ra bảng điều khiển vì chức năng in sẽ làm điều đó. Tôi đang hỏi "Làm thế nào để in ra bảng điều khiển mà không nối dòng mới vào văn bản đầu vào"
Ankit Goel

2
Đây là tài liệu rõ ràng trong Xcode 7 beta release notes: "println và in đã được sáp nhập với nhau thành một chức năng in duy nhất với một đối số mặc định ..."
Martin R

Câu trả lời:


208

Bắt đầu từ Swift 2.0, phương pháp in không có dòng mới được khuyến nghị là:

print("Hello", terminator:"")

Mặc dù bạn chỉ nhìn thấy giao diện với seperatortham số. Bạn chỉ có thể bỏ qua nó vì nó có giá trị mặc địnhfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian

2
Nơi nào trong tài liệu Swift sẽ có người tìm ra cái gì defaultbằng?
7stud

1
@ 7stud defaultlà trình giữ chỗ cho giá trị mặc định. Lý tưởng nhất là tài liệu phải chứa giá trị thực, không phải là trình giữ chỗ.
Sulthan

1
Giá trị mặc định là: dấu phân tách "" (dấu cách đơn) và dấu chấm dứt \ n (dòng mới)
selva

68

printchức năng đã thay đổi hoàn toàn kể từ phiên bản cuối của Swift , bây giờ nó trông đơn giản hơn nhiều và có nhiều biến thể của phương thức để in ra bảng điều khiển tiêu chuẩn.

Chữ ký phương thức cho bản in trông giống như thế này,

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

Và đây là một số cách sử dụng,

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

Bản in:

Swift is awesome.
Swift is awesome
Swift is awesome.

Kết hợp

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

Bản in:

This is wild world

Vì vậy, sử dụng terminator, bạn nên cẩn thận rằng các nội dung có liên quan đến cùng một dòng.

Đối tượng in với 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)

Bản in:

<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)
  }
}

Bây giờ, với lldb , bạn có thể sử dụng lệnh po và nó sẽ in đối tượng như thế này trong bảng điều khiển lldb,

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

Đăng nhập vào tệp bằng 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)!)
  }
}

Bây giờ, sử dụng tính năng in để phát trực tuyến,

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

In ra tệp:

First of all
Then after
And finally

CustomReflectable

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

Bây giờ, trong trình gỡ lỗi lldb, nếu bạn sử dụng lệnh po,

> po person

Kết quả sẽ như thế này,

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

Cũng không hoạt động đối với tôi trong Xcode 7beta4. Đang gọi print("foo", appendNewLine: false)biên dịch nhưng đầu ra là (foo), falsevà dù sao thì một dòng mới cũng được nối vào!
mluisbrown

@mluisbrown it appendNewline(chữ thường l)
JeremyP

11

Trong Swift 2.0, bạn có thể làm điều này:

Phiên bản cơ bản

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

Sử dụng thuốc diệt mối

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

Sử dụng dấu phân tách

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

Sử dụng dấu phân tách và dấu chấm dứt

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

Sử dụng một biến

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

Sử dụng hai biến

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

Theo mặc định, dấu phân cách là một không gian" "
Jayram Kumar

4

Nếu bạn muốn cùng một dòng trong vòng lặp:

for i in 1...4
{
    print("", i, separator: " ", terminator:"")
}
print()

Đầu ra: 1 2 3 4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.