在Swift 3中搜索并提取子字符串

时间:2017-11-07 15:49:41

标签: ios swift3

Swift编程相对较新。

我得到一个字典,我需要从中获取用户名(名字和姓氏)并将其显示在表格视图单元格中以及其他数据。

在iPhone 5及以下版本中,由于屏幕宽度仅为320,因此要求只显示名字的第一个名称和第一个字符。

例如:“霍华德马克”到“霍华德M”

我确信有一种优雅的方式来提取所需的字符串。

struct ScreenSize
{
    static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType
{
    static let IS_IPHONE_5_OR_LESS = (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH <= 568.0)
}

func functionCall (referralData:[String: Any?])
{
    var myMutableString = NSMutableAttributedString()


    if var nameString = referralData[KEY_FULL_NAME]
        {

              if  DeviceType.IS_IPHONE_5_OR_LESS
              {
                var a = nameString as? NSString

                var arr = a?.components(separatedBy: " ")

                let newStr = arr?[0] as? String
                nameString = newStr
                if((arr?.count)! > 1)
                {
                    if let secondString = arr?[1]
                    {
                        let newStr2 = newStr as? NSString

                        let secondChar = newStr2?.character(at: 0)
                        let stringchar:String! = String(secondChar!)
                        nameString = "\(newStr!) \(stringchar)"
                    }
                }

                print("iPhone 5 or less")
            }
            else
            {
                print("Greater than iPhone 5")
            }
    }
}

3 个答案:

答案 0 :(得分:0)

也许是这样的?

let fullName = "Dominik Pich"
var parts = fullName.components(separatedBy: " ")

if parts.count > 0,
  let lastNameInitial = parts.last?.prefix(1) {
  parts[parts.count-1] = String(lastNameInitial)
}

let truncatedName = parts.joined(separator: " ")

//use
print("fullName: \(fullName)")
print("truncatedName: \(truncatedName)")

我将它包装在一个很好的String扩展中 - 例如计算属性truncateLast

答案 1 :(得分:0)

我在使用Swift的内置子字符串命令时找到的最有用的答案是:https://stackoverflow.com/a/39677331/5495979

虽然使用substring命令仍然需要先获取范围或索引,所以仍然需要几个命令才能实现。

所以使用我在上面提到的SO答案中的首选方法,我只需获取第一个字符的索引并使用substring命令并将其强制转换为字符串:

let index = secondString.index(secondString.startIndex, offsetBy: 0)
let stringChar = String(secondString.substring(to: index))

我还想告诉您,在获取姓氏的第一个字母时,代码中似乎存在逻辑错误。您使用if let secondString = arr?[1]打开字符串组件数组中的姓氏,但在解析secondString之前,请不要将newStr2中存储的解包字符串分配给newStr2对于字符串中的第一个字符。现在看来,当您使用let secondChar = newStr2?.character(at: 0)解析字符串的第一个字符时,您实际上将从第一个名称解析第一个字符(因为在使用let newStr2 = newStr as? NSString分配newStr2时,您实际上正在分配第一个字符来自名称字符串数组,因为newStr只与let newStr = arr?[0] as? String

结合

答案 2 :(得分:0)

我认为任何人都不应该再考虑Swift 3了。这是一个Swift 4示例:

var name = "Veeblefetzer Rumplestiltskin"
if let r = name.range(of: " ", options: .backwards, range: name.startIndex..<name.endIndex) {
    name = String(name[name.startIndex..<name.index(r.upperBound, offsetBy: 1)])
}
name // "Veeblefetzer R"