Swift小技巧(九)

1.如何解析html字符串中的特殊字符为正常显示的字符

//扩展一个方法,用于解析出html字符
extension String {
    init(htmlEncodedString: String) {
        self.init()
        guard let encodedData = htmlEncodedString.data(using: .utf8) else {
            self = htmlEncodedString
            return
        }
        
        let attributedOptions: [String : Any] = [
            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
        ]
        
        do {
            let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
            self = attributedString.string
        } catch {
            print("Error: \(error)")
            self = htmlEncodedString
        }
    }
}

let string = "The Weeknd ‘King Of The Fall’"
print(String(htmlEncodedString: string))//The Weeknd ‘King Of The Fall’

2.如何使手机震动?

import AudioToolbox

//使手机震动
      AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

3.如何注册cell到集合视图中

//swift
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "ReuserIdentifier")

4.如何实现指定范围内,倒序使用,比如1...5,从5开始倒序使用

for i in (1...5).reversed() {
    print(i)//5 4 3 2 1
}

//或者
for i in stride(from: 5, to: 0, by: -1) {
    print(i)//5 4 3 2 1
}

5.Data与Image之间如何互相转换

let image = UIImage(named: "a.png")
//image->data
let data = UIImagePNGRepresentation(image!)

//data->image,scale表示缩放比例,1表示原图
let imagePt = UIImage(data: data!, scale: 1)

6.角度与弧度之间如何转换

extension Int {
    //角度->弧度
    var degreesToRadians: Double { return Double(self) * .pi / 180 }
}
extension FloatingPoint {
    //角度->弧度
    var degreesToRadians: Self { return self * .pi / 180 }
    //弧度->角度
    var radiansToDegrees: Self { return self * 180 / .pi }
}
//使用
45.degreesToRadians            // 0.7853981633974483
Double(45).degreesToRadians    // 0.7853981633974483
CGFloat(45).degreesToRadians   // 0.785398163397448
Float(45).degreesToRadians     // 0.7853981
Float80(45).degreesToRadians   // 0.785398163397448278999

7.如何解决问题:directory not found for option '-F/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.0.sdk/Developer/Library/Frameworks'

首先找到生成错误的目标,然后删除“框架搜索路径”构建设置中的路径来消除这些错误。

53vpB.png

8.如何将数组内元素通过指定字符连接成字符串

//将数组内元素通过指定字符连接成字符串
let array = ["str1", "str2", "str3", ""]
array.joined(separator: "-")//str1-str2-str3

//如果需要过滤掉为空或者特定的元素
let new = array.filter { $0 != "" }
new.joined(separator: "-")

9.函数和方法如何返回多个值

//返回一个元组来解决
func getTime() -> (Int, Int, Int) { ... return ( hour, minute, second)}
//然后它被调用为:
let (hour, minute, second) = getTime()
//要么:
let time = getTime()println("hour: \(time.0)")

10.如何跳转到系统设置指定页面,比如通用设置,wifi设置等

首先,在URL Types的URL Schemes中添加App-Prefs字符。

屏幕快照 2017-06-12 下午2.23.47.png

然后在要跳转的地方使用:

UIApplication.shared.open(URL(string:"App-Prefs:root=General")!, options: [:]) {
            if $0 {
                print("打开成功!");
            }else {
                print("打开失败!");
            }
        }

11.如何添加高斯模糊效果

        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = view.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(blurEffectView)

12.如何限制uitextfield字符的输入个数

    @IBOutlet weak var field: UITextField!
    //限制输入10个字符
    let limitLength = 10
    
    override func viewDidLoad() {
        super.viewDidLoad()
        field.delegate = self
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let text = textField.text else { return true }
        let newLength = text.characters.count + string.characters.count - range.length
        return newLength <= limitLength
    }

13.如何对两个数组进行比较操作,比如求相同、不同部分

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1: Set<String> = Set(array1)
let set2: Set<String> = Set(array2)

set1.union(set2)//a b c d
set1.intersection(set2)//a b
set1.symmetricDifference(set2)//d c

14.如何判断一个可选字符串是nil还是空字符串

var str: String?

//判断str是否为Nil或者为空字符串
(str ?? "").isEmpty//true
//判断str是否为nil或者为空字符串,如果是返回“默认”
(str ?? "").isEmpty ? "默认" : str!//默认

15.如何创建出纯色的UIImage


public extension UIImage {
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}

//指定颜色和image大小
let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200))

16.如何通过button的addTarget传递附加参数

可以自定义一个button集成子button

class subclassedUIButton: UIButton {
    var indexPath: Int?
    var urlString: String?
}

这样子,在addTarget方法中,就可以使用button新添加的属性获得附加参数。

17.如何将字符串拆分为字符数组

let str = "hello"
let arr = Array(str.characters)
print(arr)

18.如何判断一个弹出视图是模态弹出还是导航堆栈弹出

func isModal() -> Bool {
    if self.presentingViewController != nil {
        return true
    } else if self.navigationController?.presentingViewController?.presentedViewController == self.navigationController  {
        return true
    } else if self.tabBarController?.presentingViewController is UITabBarController {
        return true
    }

    return false
}

19.如何检查指定文件是否存在

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
let filePath = url.appendingPathComponent("nameOfFileHere")?.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath!) {
    print("FILE AVAILABLE")
} else {
    print("FILE NOT AVAILABLE")
}

20.如何实现,子类必须要实现某个方法

1.使用协议

protocol SomeProtocol {
    func someMethod()
}//继承该协议的类,必须要实现该方法

2.或者在父类的方法中,使用断言

class SuperClass {
    func someFunc() {
        fatalError("Must Override")
    }
}//如果子类没有重写该方法,就会触发断言
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容