在 Swift 中生成一个随机词
Generate a Random Word in Swift
我正在尝试探索 Swift 编程语言。我正在搜索 Swift API,然后找到了 UIReferenceLibraryViewController
class。我找到了 return 一个 bool 值的方法,如果一个词是否真实(.dictionaryHasDefinitionForTerm
),我还寻找了一个可以 return 随机词的方法。
遗憾的是,这种方法似乎并不存在。我意识到我可以探索第 3 方 API,但是如果可能的话我更愿意远离他们。
我想也许我可以随机排列所有字母,然后检查它们是否构成了一个真实的单词,但这似乎……好吧……愚蠢。
有人知道生成随机词的方法吗?
我也不想手动做一个长长的几千字的列表,怕记错。我也想尝试学习一些语法和新方法,而不是如何导航列表。
我建议你检查这个项目。已经有人为您完成了以下操作!
LoremSwiftum
LoremSwiftum is a lightweight lorem ipsum generator for iOS written in Swift. It supports generating texts in different formats (words, sentences, paragraphs), miscellaneous data (names, URLs, dates etc.) and placeholder images for iOS (UIImage). This is a reimplementation of the project LoremIpsum written in Objective-C.
https://github.com/lukaskubanek/LoremSwiftum
这个项目只有一个 swift 文件。(~300 行)
因此,我认为阅读该文件会对您有所帮助。
https://github.com/lukaskubanek/LoremSwiftum/blob/master/Sources/LoremSwiftum.swift
我的/usr/share/dict/words
文件是符号link到/usr/share/dict/words/web2
,1934年韦伯斯特第二国际词典。文件只有2.4mb,所以你不应该看太多将全部内容加载到内存中时性能受到影响。
这是我编写的一小段 Swift 3.0 代码段,用于从字典文件中加载随机单词。请记住在 运行.
之前将文件复制到应用程序的包中
if let wordsFilePath = Bundle.main.path(forResource: "web2", ofType: nil) {
do {
let wordsString = try String(contentsOfFile: wordsFilePath)
let wordLines = wordsString.components(separatedBy: .newlines)
let randomLine = wordLines[numericCast(arc4random_uniform(numericCast(wordLines.count)))]
print(randomLine)
} catch { // contentsOfFile throws an error
print("Error: \(error)")
}
}
Swift 2.2:
if let wordsFilePath = NSBundle.mainBundle().pathForResource("web2", ofType: nil) {
do {
let wordsString = try String(contentsOfFile: wordsFilePath)
let wordLines = wordsString.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
let randomLine = wordLines[Int(arc4random_uniform(UInt32(wordLines.count)))]
print(randomLine)
} catch { // contentsOfFile throws an error
print("Error: \(error)")
}
}
Swift 1.2 片段:
if let wordsFilePath = NSBundle.mainBundle().pathForResource("web2", ofType: nil) {
var error: NSError?
if let wordsString = String(contentsOfFile: wordsFilePath, encoding: NSUTF8StringEncoding, error: &error) {
if error != nil {
// String(contentsOfFile: ...) failed
println("Error: \(error)")
} else {
let wordLines = wordsString.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
let randomLine = wordLines[Int(arc4random_uniform(UInt32(wordLines.count)))]
print(randomLine)
}
}
}
获取长度为 5 的随机单词。
func randomWord() -> String
{
var x = "";
for _ in 0..<5{
let string = String(format: "%c", Int.random(in: 97..<123)) as String
x+=string
}
return x
}
试试这个片段
struct RandomWordGenerator {
private let words: [String]
func ranged(_ range: ClosedRange<Int>) -> RandomWordGenerator {
RandomWordGenerator(words: words.filter { range.contains([=10=].count) })
}
}
extension RandomWordGenerator: Sequence, IteratorProtocol {
public func next() -> String? {
words.randomElement()
}
}
extension RandomWordGenerator {
init() throws {
let file = try String(contentsOf: URL(fileURLWithPath: "/usr/share/dict/words"))
self.init(words: file.components(separatedBy: "\n"))
}
}
我正在尝试探索 Swift 编程语言。我正在搜索 Swift API,然后找到了 UIReferenceLibraryViewController
class。我找到了 return 一个 bool 值的方法,如果一个词是否真实(.dictionaryHasDefinitionForTerm
),我还寻找了一个可以 return 随机词的方法。
遗憾的是,这种方法似乎并不存在。我意识到我可以探索第 3 方 API,但是如果可能的话我更愿意远离他们。
我想也许我可以随机排列所有字母,然后检查它们是否构成了一个真实的单词,但这似乎……好吧……愚蠢。
有人知道生成随机词的方法吗?
我也不想手动做一个长长的几千字的列表,怕记错。我也想尝试学习一些语法和新方法,而不是如何导航列表。
我建议你检查这个项目。已经有人为您完成了以下操作!
LoremSwiftum
LoremSwiftum is a lightweight lorem ipsum generator for iOS written in Swift. It supports generating texts in different formats (words, sentences, paragraphs), miscellaneous data (names, URLs, dates etc.) and placeholder images for iOS (UIImage). This is a reimplementation of the project LoremIpsum written in Objective-C.
https://github.com/lukaskubanek/LoremSwiftum
这个项目只有一个 swift 文件。(~300 行) 因此,我认为阅读该文件会对您有所帮助。
https://github.com/lukaskubanek/LoremSwiftum/blob/master/Sources/LoremSwiftum.swift
我的/usr/share/dict/words
文件是符号link到/usr/share/dict/words/web2
,1934年韦伯斯特第二国际词典。文件只有2.4mb,所以你不应该看太多将全部内容加载到内存中时性能受到影响。
这是我编写的一小段 Swift 3.0 代码段,用于从字典文件中加载随机单词。请记住在 运行.
之前将文件复制到应用程序的包中if let wordsFilePath = Bundle.main.path(forResource: "web2", ofType: nil) {
do {
let wordsString = try String(contentsOfFile: wordsFilePath)
let wordLines = wordsString.components(separatedBy: .newlines)
let randomLine = wordLines[numericCast(arc4random_uniform(numericCast(wordLines.count)))]
print(randomLine)
} catch { // contentsOfFile throws an error
print("Error: \(error)")
}
}
Swift 2.2:
if let wordsFilePath = NSBundle.mainBundle().pathForResource("web2", ofType: nil) {
do {
let wordsString = try String(contentsOfFile: wordsFilePath)
let wordLines = wordsString.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
let randomLine = wordLines[Int(arc4random_uniform(UInt32(wordLines.count)))]
print(randomLine)
} catch { // contentsOfFile throws an error
print("Error: \(error)")
}
}
Swift 1.2 片段:
if let wordsFilePath = NSBundle.mainBundle().pathForResource("web2", ofType: nil) {
var error: NSError?
if let wordsString = String(contentsOfFile: wordsFilePath, encoding: NSUTF8StringEncoding, error: &error) {
if error != nil {
// String(contentsOfFile: ...) failed
println("Error: \(error)")
} else {
let wordLines = wordsString.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
let randomLine = wordLines[Int(arc4random_uniform(UInt32(wordLines.count)))]
print(randomLine)
}
}
}
获取长度为 5 的随机单词。
func randomWord() -> String
{
var x = "";
for _ in 0..<5{
let string = String(format: "%c", Int.random(in: 97..<123)) as String
x+=string
}
return x
}
试试这个片段
struct RandomWordGenerator {
private let words: [String]
func ranged(_ range: ClosedRange<Int>) -> RandomWordGenerator {
RandomWordGenerator(words: words.filter { range.contains([=10=].count) })
}
}
extension RandomWordGenerator: Sequence, IteratorProtocol {
public func next() -> String? {
words.randomElement()
}
}
extension RandomWordGenerator {
init() throws {
let file = try String(contentsOf: URL(fileURLWithPath: "/usr/share/dict/words"))
self.init(words: file.components(separatedBy: "\n"))
}
}