提问人:CalebGates 提问时间:5/12/2023 更新时间:5/12/2023 访问量:95
如何更改字符串中的前两个单词?
How to change the first two words in the string?
问:
这个问题有点难以理解,因为我试图找到一种方法来满足我的应用程序(在这种情况下是俄语)中外语的语法要求。我试图在俄罗斯 Stackoverflow 上找到答案,但它已经死了,而且一直都是这样。这将是一篇很长的读物,但请耐心等待,因为我希望人们了解我在做什么,以及为什么除了硬编码一堆逻辑解决方法之外没有其他解决方案。
设置如下:
- 我有两个视图控制器(FirstVC 和 SecondVC)。
- 每个视图控制器都有一个表。
- 用户点击 FirstVC 中的单元格后,该单元格的内容将传递到 SecondVC 中的表头视图。
- 但是:SecondVC 的表头视图中的文本应该考虑俄语变格(俄语如此困难的原因之一)。
- SecondVC 的表头视图有两个字符串彼此重叠。最上面的那个写着“СПИСОК”,翻译为“LIST”。它是静态的,将永远保持原样。最下面的一个写着“участников”(翻译为“的参与者”),然后是字符串插值。总而言之,它应该读作“LIST of participants of the”,后跟从FirstVC的表单元格继承的任何事件名称。
这是最难的部分。在英语中,在大多数情况下,你可以把单词放在一起,然后你就有一个语法正确的句子。但从这个意义上说,俄语很奇怪,因为你必须修改单词本身来解释变格(我能想到的最接近的类比是当你使用单数和复数时。你不能说:“我有两瓶水”。您必须在“瓶子”中添加“s”。类似的东西。
幸运的是,我需要操作的单词通常是字符串中的第一个单词。然而,更罕见的是,人们可能不得不处理字符串中第一个和第二个单词的组合。
多亏了 @Leo Dabus 在 Stackoverflow 上的一个回答,我设法从字符串中取出第一个单词,对其进行更改,然后添加到该字符串中的其余单词中。现在我需要一种方法来从字符串中取出前两个单词,以解决上面提到的那些罕见情况。如何使用相同的逻辑来做到这一点?
下面是 SecondVC 的代码:
import UIKit
class SecondVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var names: [Cell2Model] = []
var textForChanging: String = ""
var switchedFirstWord: String {
switch textForChanging.firstWord {
case "Соревнование": return "соревнования" //translates as "competition"
default: return "none" } }
var restoOfTheName: String {
var string = textForChanging
string.enumerateSubstrings(in: string.startIndex..., options: .byWords) { (_, _, enclosingRange, stop) in
string.removeSubrange(enclosingRange)
stop = true }
return string }
var adjustedEventNameText: String {
return switchedFirstWord + " " + restoOfTheName }
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
// names will be taken from UITextFields on the fourth view controller
names = [
(Cell2Model(name: "Participant 1")),
(Cell2Model(name: "Participant 2")),
(Cell2Model(name: "Participant 3")) ]
let tableHeader = UIView()
tableView.tableHeaderView = tableHeader
let labelOne = UILabel(frame: tableHeader.bounds)
labelOne.text = "СПИСОК"
labelOne.font = UIFont(name:"Arial-BoldMT", size: 17.0)
labelOne.numberOfLines = 0
labelOne.lineBreakMode = .byWordWrapping
labelOne.textAlignment = .center
labelOne.translatesAutoresizingMaskIntoConstraints = false
let labelTwo = UILabel(frame: tableHeader.bounds)
labelTwo.translatesAutoresizingMaskIntoConstraints = false
labelTwo.text = "участников \(adjustedEventNameText)"
labelTwo.font = UIFont(name:"Arial-BoldMT", size: 17.0)
labelTwo.numberOfLines = 0
labelTwo.lineBreakMode = .byWordWrapping
labelTwo.textAlignment = .center
labelTwo.translatesAutoresizingMaskIntoConstraints = false
tableHeader.addSubview(labelOne)
tableHeader.addSubview(labelTwo)
let g = tableHeader.layoutMarginsGuide
NSLayoutConstraint.activate([
labelOne.topAnchor.constraint(equalTo: g.topAnchor, constant: 11.0),
labelOne.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
labelOne.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0),
labelTwo.topAnchor.constraint(equalTo: labelOne.bottomAnchor, constant: 0.0),
labelTwo.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
labelTwo.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0), ])
let c = labelTwo.bottomAnchor.constraint(equalTo: g.bottomAnchor, constant: -11.0)
c.priority = .required - 1
c.isActive = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let tableHeader = tableView.tableHeaderView {
let fitSize: CGSize = CGSize(width: tableView.frame.width, height: .greatestFiniteMagnitude)
let sz: CGSize = tableHeader.systemLayoutSizeFitting(fitSize, withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
let height: CGFloat = sz.height
var headerFrame = tableHeader.frame
if height != headerFrame.size.height {
headerFrame.size.height = height
tableHeader.frame = headerFrame
tableView.tableHeaderView = tableHeader } } }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return names.count }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "secondCell", for: indexPath) as! SecondCell
let Name = names[indexPath.row]
cell.label.text = Name.name
return cell } }
extension StringProtocol {
var byWords: [SubSequence] { components(separated: .byWords) }
func components(separated options: String.EnumerationOptions)-> [SubSequence] {
var components: [SubSequence] = []
enumerateSubstrings(in: startIndex..., options: options) { _, range, _, _ in components.append(self[range]) }
return components }
var firstWord: SubSequence? {
var word: SubSequence?
enumerateSubstrings(in: startIndex..., options: .byWords) { _, range, _, stop in
word = self[range]
stop = true }
return word } }
如果需要,以下是 FirstVC 的代码:
import UIKit
class FirstVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var names: [Cell1Model] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
// names will be taken from UITextFields on the third view controller
names = [
Cell1Model(name: "Соревнование по легкой атлетике"), // translates as "athletics competition (or "competition on athletics" to put it into the Russian words order)
Cell1Model(name: "Благотворительное соревнование по легкой атлетике") // translates as "athletics charity competition" (or "charity competition on athletics" in the Russian words order)
]
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let vc = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC {
vc.textForChanging = names[indexPath.row].name!
self.navigationController?.pushViewController(vc, animated: true) } }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return names.count }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell
let Name = names[indexPath.row]
cell.label.text = Name.name
return cell }
先谢谢你!
答:
你可以使用 split(separator: “по”, maxSplits: 1) 结果数组中的第一个结果将是 “Соревнование” 和 “Благотворительно е соревнование” 在两个 Cell1Model 示例中
这些线路已经在 Switch 中检查过了,就像你以前一样
(无论如何,图像的实现是需要的) Xcode 中有一个用于单词变格的可本地化工具,也许它会对您有所帮助。
评论